Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Pointers and functions

Reply
Thread Tools

Pointers and functions

 
 
Doug Haber
Guest
Posts: n/a
 
      09-14-2006
Hi All,

The following code make sense to me:

void x() {
int *a = NULL;
int b;
b = 4;
a = &b;
printf("a: %d",*a); // prints "a: 4"
}

Can someone please explain why this blows up?

void x() {
int *a = NULL;
y(a);
printf("a: %d",a); // Dies
}

void y(int* i){
int b;
b = 4;
i = &b;
}

Thanks again for the help!
Doug



 
Reply With Quote
 
 
 
 
=?ISO-8859-1?Q?Ney_Andr=E9_de_Mello_Zunino?=
Guest
Posts: n/a
 
      09-14-2006
Doug Haber wrote:

[...]

> Can someone please explain why this blows up?
>
> void x() {
> int *a = NULL;
> y(a);
> printf("a: %d",a); // Dies
> }
>
> void y(int* i){
> int b;
> b = 4;
> i = &b;
> }


It doesn't blow up. What made you think it should? Are you sure the code
you posted is the one on which you ran your tests? To begin with, x()
and y() should to be swapped or a forward declaration of y() introduced.
Please, try to post minimal, compilable code; that will make it easier
for people to assist you.

Regards,

--
Ney André de Mello Zunino
 
Reply With Quote
 
 
 
 
Murali Krishna
Guest
Posts: n/a
 
      09-14-2006

Doug Haber wrote:
> Hi All,
>
> The following code make sense to me:
>
> void x() {

Doug Haber wrote:
> Hi All,
>
> The following code make sense to me:
>
> void x() {
> int *a = NULL;
> int b;
> b = 4;
> a = &b;
> printf("a: %d",*a); // prints "a: 4"
> }
>
> Can someone please explain why this blows up?
>
> void x() {
> int *a = NULL;
> y(a);
> printf("a: %d",a); // Dies
> }
>
> void y(int* i){
> int b;
> b = 4;
> i = &b;
> }
>


I am sure the function y() will blow up. I will lead to run time
exception.

reason is simple. you have declared a local varialble b in function
y().
Variable b exists in function y()'s scope only.
You are trying to refer the address of b outside the function. which
will not exists outside y().
after call to y(a), a points to b of function y().
This causes the exception.

-- Murali Krishna
> int *a = NULL;
> int b;
> b = 4;
> a = &b;
> printf("a: %d",*a); // prints "a: 4"
> }
>
> Can someone please explain why this blows up?
>
> void x() {
> int *a = NULL;
> y(a);
> printf("a: %d",a); // Dies
> }
>
> void y(int* i){
> int b;
> b = 4;
> i = &b;
> }
>
> Thanks again for the help!
> Doug


 
Reply With Quote
 
Murali Krishna
Guest
Posts: n/a
 
      09-14-2006

Doug Haber wrote:
> Hi All,
>
> The following code make sense to me:
>
> void x() {
> int *a = NULL;
> int b;
> b = 4;
> a = &b;
> printf("a: %d",*a); // prints "a: 4"
> }
>
> Can someone please explain why this blows up?
>
> void x() {
> int *a = NULL;
> y(a);
> printf("a: %d",a); // Dies
> }
>
> void y(int* i){
> int b;
> b = 4;
> i = &b;
> }
>


I am sure the function y() will blow up. It will lead to run time
exception.

reason is simple. you have declared a local varialble b in function
y().
Variable b exists in function y()'s scope only.
You are trying to refer the address of b outside the function. which
will not exists outside y().
after call to y(a), a points to b of function y().
This causes the exception.

-- Murali Krishna

 
Reply With Quote
 
user@domain.invalid
Guest
Posts: n/a
 
      09-14-2006
Ney André de Mello Zunino wrote:

> Doug Haber wrote:
>
> [...]
>
>> Can someone please explain why this blows up?
>>
>> void x() {
>> int *a = NULL;
>> y(a);
>> printf("a: %d",a); // Dies
>> }
>>
>> void y(int* i){
>> int b;
>> b = 4;
>> i = &b;
>> }

>
>
> It doesn't blow up. What made you think it should? Are you sure the
> code you posted is the one on which you ran your tests? To begin with,
> x() and y() should to be swapped or a forward declaration of y()
> introduced. Please, try to post minimal, compilable code; that will
> make it easier for people to assist you.
>
> Regards,
>

1 - In y(...) you assign to i &b which is a local variable that only
exist during y(...) life.
2- Your printf prints incorrect value because you want to print a and
not *a.
3- Furthemore you will have crash if you write printf like this:
printf("a: %d",*a);

1 bad possible solution
void y(int* i){
static int b;
b = 4;
i = &b;
}

Stef
 
Reply With Quote
 
Markus Grueneis
Guest
Posts: n/a
 
      09-14-2006
Murali Krishna schrieb:
> Doug Haber wrote:
>> Hi All,
>>
>> The following code make sense to me:
>>
>> void x() {

> Doug Haber wrote:
>> Hi All,
>>
>> The following code make sense to me:
>>
>> void x() {
>> int *a = NULL;
>> int b;
>> b = 4;
>> a = &b;
>> printf("a: %d",*a); // prints "a: 4"
>> }
>>
>> Can someone please explain why this blows up?
>>
>> void x() {
>> int *a = NULL;
>> y(a);
>> printf("a: %d",a); // Dies
>> }
>>
>> void y(int* i){
>> int b;
>> b = 4;
>> i = &b;
>> }
>>

>
> I am sure the function y() will blow up. I will lead to run time
> exception.
>
> reason is simple. you have declared a local varialble b in function
> y().
> Variable b exists in function y()'s scope only.
> You are trying to refer the address of b outside the function. which
> will not exists outside y().
> after call to y(a), a points to b of function y().
> This causes the exception.
>


Additionally, a will still be nullptr after y(a), because the integer
pointer is passed by value, not by reference, therefore x() never sees
the value &b;

To the OP:
If you really want to access variables of local visibility through a
returned reference (which is actually one quite convenient way for
implementing a singleton), the locally visible variable must be static.

For instance:

MyClass* getSingletonInstance()
{
static MyClass hooray; // the static makes the difference
return &hooray;
}

void theCaller()
{
MyClass* iWantTheInstance= getSingletonInstance();
}

Now you can safely access static MyClass hooray from within theCaller.


> -- Murali Krishna
>> int *a = NULL;
>> int b;
>> b = 4;
>> a = &b;
>> printf("a: %d",*a); // prints "a: 4"
>> }
>>
>> Can someone please explain why this blows up?
>>
>> void x() {
>> int *a = NULL;
>> y(a);
>> printf("a: %d",a); // Dies
>> }
>>
>> void y(int* i){
>> int b;
>> b = 4;
>> i = &b;
>> }
>>
>> Thanks again for the help!
>> Doug

>

 
Reply With Quote
 
Doug Haber
Guest
Posts: n/a
 
      09-14-2006
Hi All,

Sorry for the confusing post. Here is code that compiles:

void doIt(int* x){
int b = 2;
x = &b;
}

int _tmain(int argc, _TCHAR* argv[])
{
int* a = NULL;
doIt(a);
printf("a = %d", *a); // blows up
return 0;
}

I think I have two issues:
1. int b in doIt() goes out of scope when the function returns, so its
address is no longer valid when we get back to _tmain(). However even
if I rewrite doIt() as:

void doIt(int* x){
x = new int;
*x = 2;
}
It still fails which brings me to:
2. I think what I really want is for doIt() to take an int**. I think
the reason is that if it takes int *, it's actually getting a copy of
the pointer in _tmain, so allocating space and assigning a value to
this new pointer doesn't do me any good. However, if I rewrite the
program as below it works. Does this make sense?

void doIt(int** x){
*x = new int;
int b = 2;
**x = b;
}

int _tmain(int argc, _TCHAR* argv[])
{
int* a = NULL;
doIt(&a);
printf("a = %d", *a); // prints "a = 2"
return 0;
}

Finally, the below also works, but I think it's *bad* because I think I
shouldn't use an address from another function. Do you agree?

void doIt(int** x){
*x = new int;
int b = 2;
*x = &b;
}


Thanks again!
Doug


Doug Haber wrote:
> Hi All,
>
> The following code make sense to me:
>
> void x() {
> int *a = NULL;
> int b;
> b = 4;
> a = &b;
> printf("a: %d",*a); // prints "a: 4"
> }
>
> Can someone please explain why this blows up?
>
> void x() {
> int *a = NULL;
> y(a);
> printf("a: %d",a); // Dies
> }
>
> void y(int* i){
> int b;
> b = 4;
> i = &b;
> }
>
> Thanks again for the help!
> Doug


 
Reply With Quote
 
Murali Krishna
Guest
Posts: n/a
 
      09-15-2006
First, let us not top-post in this group. Luckly I never got a warning
regarding this till now.

Doug Haber wrote:
> Hi All,
>
> Sorry for the confusing post. Here is code that compiles:
>
> void doIt(int* x){
> int b = 2;
> x = &b;
> }
>
> int _tmain(int argc, _TCHAR* argv[])
> {
> int* a = NULL;
> doIt(a);
> printf("a = %d", *a); // blows up
> return 0;
> }


> I think I have two issues:
> 1. int b in doIt() goes out of scope when the function returns, so its
> address is no longer valid when we get back to _tmain().


OK, we have already discussed about local varialbles. We should not
return the address of the local variable. because it dies after the
function execution. but a doesn't get the address of b. it still is
zero.

> However even
> if I rewrite doIt() as:
>
> void doIt(int* x){
> x = new int;
> *x = 2;
> }
> It still fails which brings me to:
> 2. I think what I really want is for doIt() to take an int**. I think
> the reason is that if it takes int *, it's actually getting a copy of
> the pointer in _tmain, so allocating space and assigning a value to
> this new pointer doesn't do me any good.


you are almost right. In main, we have declared pointer a and assigned
it to NULL (zero).
a's work is to point to some address and a is also created with some
address (&a).

so &a will have some address (system created)
our a points to zero. we assigned.

now in function doIt(int *x), x takes zero. not &a. and ofcourse x will
have it's own address (&x), that is no where related to &a. now &x and
&a are different.

in x = new int; x gets a value which is no where related to a. So when
doIt() completes it's execution, a will still point to zero. That is
why it fails.

> However, if I rewrite the
> program as below it works. Does this make sense?
>
> void doIt(int** x){
> *x = new int;
> int b = 2;
> **x = b;
> }
>
> int _tmain(int argc, _TCHAR* argv[])
> {
> int* a = NULL;
> doIt(&a);
> printf("a = %d", *a); // prints "a = 2"
> return 0;
> }


it makes sense. it should take the address of a, where a is a pointer
so we have to take pointer to pointer.
with the above explanation again. "new int" allocates memory. The point
is where it is allocating memory. For sure, it is allocating memory for
a. It is not local to function doIt().

> Finally, the below also works, but I think it's *bad* because I think I
> shouldn't use an address from another function. Do you agree?
>
> void doIt(int** x){
> *x = new int;
> int b = 2;
> *x = &b;
> }


It worked because you are not manupulating any data in &b after the
function execution. but are you getting 2 in the result?
in my knowledge the results are undefined.
This is program logic error.

HTH.

-- Murali Krishna.

 
Reply With Quote
 
Markus Schoder
Guest
Posts: n/a
 
      09-15-2006
Murali Krishna wrote:
>> Can someone please explain why this blows up?
>>
>> void x() {
>> int *a = NULL;
>> y(a);
>> printf("a: %d",a); // Dies
>> }
>>
>> void y(int* i){
>> int b;
>> b = 4;
>> i = &b;
>> }
>>

>
> I am sure the function y() will blow up. I will lead to run time
> exception.


Not really. Function y() is well defined yet somewhat useless since it
has no observable effect.

> reason is simple. you have declared a local varialble b in function
> y().
> Variable b exists in function y()'s scope only.
> You are trying to refer the address of b outside the function. which
> will not exists outside y().
> after call to y(a), a points to b of function y().
> This causes the exception.


What you describe would be true if argument i would be of type int *&.

--
Markus

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Do not cast pointers to functions to pointers to primitive types ajaybgr C Programming 18 09-07-2012 04:34 AM
pointers, pointers, pointers... cerr C Programming 12 04-07-2011 11:17 PM
Pointers to char pointers in functions newbie C Programming 9 09-24-2006 10:31 AM
Questions about pointers to objects and pointers to functions Marc Thrun C Programming 15 10-04-2005 05:47 PM
Function pointers, variable argument functions calling other variable-argument functions (sort of) S?ren Gammelmark C Programming 1 01-07-2005 09:41 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57