ra170
ra170

Reputation: 3683

testing for valid pointer in c++

I wrote a little test to check for null pointer, I simplified it with int and 0, 1, instead of real classes, what I'm trying to test is something like this: return p ? 1 : 0; which in real world would be return p ? p->callmethod() : 0;

bool TestTrueFalse();
void main()
{
  int i = TestTrueFalse();

}

bool TestTrueFalse()
{  
    int one = 1;
    int * p =&one;    
    *p = 0;  

    return p ? 1 : 0;
}

now, you can see, that once the pointer becomes 0 again, the test fails, why? what's wrong with this? what's the solution?

Upvotes: 2

Views: 401

Answers (6)

a1337q
a1337q

Reputation: 780

to test it for a null pointer before inspecting the value pointed to you might use code like

if(ip != NULL)

taken from http://www.eskimo.com/~scs/cclass/notes/sx10d.html

NULL might be safer in your code, as it is more compiler independent than just writing 0. and it might also be more clear for others to read in your code.

Upvotes: 0

Dima
Dima

Reputation: 39429

A pointer is an address in memory. int *p = &one; takes the address of the variable one, and stores it in p. *p = 0; stores 0 in the memory pointed to by p, meaning that the value of one is now 0. So, you have changed what p points to, but not p itself. TestTrueFalse() will return 1.

Upvotes: 0

Starkey
Starkey

Reputation: 9781

The code *p = 0; does not set the pointer to null. It sets what p is pointing to zero.

Upvotes: 1

jA_cOp
jA_cOp

Reputation: 3305

A null pointer is a pointer which points to the address 0, not the value 0.

To set a pointer to null, do:

p = 0;

To elaborate, your code sets the pointed-to-int to 0. For example:

int i = 1;
int *p = &i;
assert(*p == 1); //p points to 1

*p = 0;
assert(*p == 0 && i == 0); //p points to the same location, but that location now contains 0

Upvotes: 1

JaredPar
JaredPar

Reputation: 755457

When testing a pointer value with a conditional in C++, it will return true if the value is non-zero and false if the value is 0. In your sample p is slated to point at the local one and hence has a non-zero address (even though the value at the address is 0). Hence you get true

Upvotes: 1

AndersK
AndersK

Reputation: 36092

*p = 0;  

you probably meant

p = 0;

*p = 0 sets what the pointer points to, not the pointer

Upvotes: 3

Related Questions