By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
449,105 Members | 1,090 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 449,105 IT Pros & Developers. It's quick & easy.

passing pointer as function parameter

P: n/a
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: mr*@tusur.ru
Sep 14 '06 #1
Share this Question
Share on Google+
6 Replies


P: n/a
Roman Mashak wrote:
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.

--
Thomas M. Sommers -- tm*@nj.net -- AB2SB

Sep 14 '06 #2

P: n/a
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;
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)

Sep 14 '06 #3

P: n/a
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
Sep 14 '06 #4

P: n/a
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.

DUThat'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: mr*@tusur.ru
Sep 15 '06 #5

P: n/a
"Roman Mashak" <mr*@tusur.ruwrites:
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.

DUThat'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.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Sep 15 '06 #6

P: n/a
Roman Mashak wrote:
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
Sep 15 '06 #7

This discussion thread is closed

Replies have been disabled for this discussion.