C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Pointers and functions

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++)
View previous topic :: View next topic  
Author Message
Doug Haber
Guest





PostPosted: Thu Sep 14, 2006 8:07 am    Post subject: Pointers and functions Reply with quote



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
Back to top
Ney André de Mello Zunino
Guest





PostPosted: Thu Sep 14, 2006 8:35 am    Post subject: Re: Pointers and functions Reply with quote



Doug Haber wrote:

[...]

Quote:
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
Back to top
Murali Krishna
Guest





PostPosted: Thu Sep 14, 2006 9:10 am    Post subject: Re: Pointers and functions Reply with quote



Doug Haber wrote:
Quote:
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
Quote:
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
Back to top
Murali Krishna
Guest





PostPosted: Thu Sep 14, 2006 9:10 am    Post subject: Re: Pointers and functions Reply with quote

Doug Haber wrote:
Quote:
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
Back to top
Guest






PostPosted: Thu Sep 14, 2006 9:10 am    Post subject: Re: Pointers and functions Reply with quote

Ney André de Mello Zunino wrote:

Quote:
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
Back to top
Markus Grueneis
Guest





PostPosted: Thu Sep 14, 2006 9:10 am    Post subject: Re: Pointers and functions Reply with quote

Murali Krishna schrieb:
Quote:
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.


Quote:
-- 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
Back to top
Murali Krishna
Guest





PostPosted: Fri Sep 15, 2006 9:10 am    Post subject: Re: Pointers and functions Reply with quote

First, let us not top-post in this group. Luckly I never got a warning
regarding this till now. :)

Doug Haber wrote:
Quote:
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.

Quote:
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.

Quote:
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().

Quote:
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.
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.