passing pointer as function parameter

R

Roman Mashak

Hello,

I belive the reason of problem is simple, but can't figure out.

This is piece of code:

struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};

extern void proc_v4(char *, ssize_t, struct timeval *);
....

int main(void)
{
static char recvbuf[BUFSIZE];
ssize_t n;
struct timeval tv2;

...

proc_v4(recvbuf, n, &tv2);
}

void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
{
struct icmp *icmp;
...
/* here I parse IP packet and address pointer on ICMP packet */
...
tvsend = (struct timeval *) icmp->icmp_data;
}

The problem is after calling proc_v4() the value of 'tv2' doesn't change,
what I can't understand, because I pass pointer, and then re-assign pointer
into another one.

Where is the problem? Thanks a lot.

With best regards, Roman Mashak. E-mail: (e-mail address removed)
 
T

T.M. Sommers

Roman said:
Hello,

I belive the reason of problem is simple, but can't figure out.

This is piece of code:

struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};

extern void proc_v4(char *, ssize_t, struct timeval *);
...

int main(void)
{
static char recvbuf[BUFSIZE];
ssize_t n;
struct timeval tv2;

...

proc_v4(recvbuf, n, &tv2);
}

void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
{
struct icmp *icmp;
...
/* here I parse IP packet and address pointer on ICMP packet */
...
tvsend = (struct timeval *) icmp->icmp_data;

What you probably want to do is assign values to the elements of
tvsend. Even if you had done everything else right (and you
haven't), icmp->icmp_data might cease to exist when proc_v4 ends,
depending on where it came from, so you don't want to keep a
pointer to it unless you know that it will live on.
}

The problem is after calling proc_v4() the value of 'tv2' doesn't change,
what I can't understand, because I pass pointer, and then re-assign pointer
into another one.

Where is the problem? Thanks a lot.

You aren't doing what you think you are doing. What you think
you are doing is something like:

struct timeval *tv2;
proc_v4(..., &tv2);

This is very different from what you are really doing.
 
?

=?ISO-8859-1?Q?=22Nils_O=2E_Sel=E5sdal=22?=

Roman said:
void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
{
struct icmp *icmp;
...
/* here I parse IP packet and address pointer on ICMP packet */
...
tvsend = (struct timeval *) icmp->icmp_data;
This line assigns to the tvsend pointer. the tvsend pointer
is local to this function.

You want to assign to what it points at rather, as the caller pointed
it at a struct timeval it can access:

*tvsend = *(struct timeval *) icmp->icmp_data;

Or
struct timeval *tmp

tmp = (struct timeval *) icmp->icmp_data;
tvsend->tv_sec = tmp->tv_sec;
tvsend->tv_usec = tmp->tv_usec;

Another problem is icmp->icmp_data; might indeed not values
a struct timeval that your platform can understand..
(alignment problems, padding and endianess might skew things)
 
D

Default User

Roman Mashak wrote:

void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
{
struct icmp *icmp;
...
/* here I parse IP packet and address pointer on ICMP packet */
...
tvsend = (struct timeval *) icmp->icmp_data;
}

The problem is after calling proc_v4() the value of 'tv2' doesn't
change, what I can't understand, because I pass pointer, and then
re-assign pointer into another one.

That's covered in the FAQs:

<http://c-faq.com/ptrs/passptrinit.html>




Brian
 
R

Roman Mashak

Hello, Default!
You wrote on 14 Sep 2006 17:59:36 GMT:

??>> void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
??>> {
??>> struct icmp *icmp;
??>> ...
??>> /* here I parse IP packet and address pointer on ICMP packet */
??>> ...
??>> tvsend = (struct timeval *) icmp->icmp_data;
??>> }
??>>
??>> The problem is after calling proc_v4() the value of 'tv2' doesn't
??>> change, what I can't understand, because I pass pointer, and then
??>> re-assign pointer into another one.

DU> That's covered in the FAQs:

DU> <http://c-faq.com/ptrs/passptrinit.html>
Hm, I'm confused. FAQ reecommends to pass the function address of pointer.
Is it considered to be a "right standard confirming way" ?
On the other hand: passing just pointer and assigning the value to what the
pointer points at (as was proposed by Nils O. Selasdal) - works well.

Which way is correct?

Thank you.

With best regards, Roman Mashak. E-mail: (e-mail address removed)
 
K

Keith Thompson

Roman Mashak said:
Hello, Default!
You wrote on 14 Sep 2006 17:59:36 GMT:

??>> void proc_v4(char *ptr, ssize_t len, struct timeval *tvsend)
??>> {
??>> struct icmp *icmp;
??>> ...
??>> /* here I parse IP packet and address pointer on ICMP packet */
??>> ...
??>> tvsend = (struct timeval *) icmp->icmp_data;
??>> }
??>>
??>> The problem is after calling proc_v4() the value of 'tv2' doesn't
??>> change, what I can't understand, because I pass pointer, and then
??>> re-assign pointer into another one.

DU> That's covered in the FAQs:

DU> <http://c-faq.com/ptrs/passptrinit.html>
Hm, I'm confused. FAQ reecommends to pass the function address of pointer.
Is it considered to be a "right standard confirming way" ?
On the other hand: passing just pointer and assigning the value to what the
pointer points at (as was proposed by Nils O. Selasdal) - works well.

Which way is correct?

It depends on what you want to do.

In general, if you have a FOO, and you want a function to modify its
value for you, you need to pass the function a FOO* (i.e., you pass it
a pointer to a FOO so it can modify your FOO).

If the FOO itself happens to be a pointer to something (i.e., you want
the function to modify a pointer object for you), then passing a FOO*
means passing a pointer-to-pointer-to-something.
 
D

Default User

Roman said:
Hello, Default!
You wrote on 14 Sep 2006 17:59:36 GMT:
DU> <http://c-faq.com/ptrs/passptrinit.html>
Hm, I'm confused. FAQ reecommends to pass the function address of
pointer. Is it considered to be a "right standard confirming way" ?
On the other hand: passing just pointer and assigning the value to
what the pointer points at (as was proposed by Nils O. Selasdal) -
works well.

Which way is correct?

Ok, I think I confused your post with one in a different thread.




Brian
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,901
Latest member
Noble71S45

Latest Threads

Top