开发者

pointer default value .?

开发者 https://www.devze.com 2023-03-31 12:16 出处:网络
Look, typedef struct jig { int *a; int *b; }temp; now stage 1 : temp *b; b= (temp*)malloc(sizeof(temp)); if(b->a != NULL)

Look,

  typedef struct jig 
   { 
         int *a;
         int *b;
   }temp;

now stage 1 :

temp *b;
b= (temp*)malloc(sizeof(temp));

if(b->a != NULL)
    printf("a is not null\n");
else
    printf("a is null\n");
if(b->b != NU开发者_StackOverflowLL)
    printf("b is not null\n");
else
    printf("b is null\n");

output is :

a is null
b is null

now stage 2 :

temp b;

if(b.a != NULL)
    printf("a is not null\n");
else
    printf("a is null\n");
if(b.b != NULL)
    printf("b is not null\n");
else
    printf("b is null\n");

output is :

a is not null
b is not null

why this is happening?


Pointers have no default value. The value they have is just whatever junk was in the memory they're using now. Sometimes a specific compiler will zero out memory, but that's not standard so don't count on it.)

The memory from malloc being NULL was a coincidence; it could have been any other value just as easily. You need to and should always manually set all your pointers to NULL.

Another alternative is you can also use calloc, which does the same thing as malloc but sets all bits to 0 in the block of memory it gives you. This doesn't help with stack variables though, so you still have to set those to NULL by yourself.


This is completely operating system dependent, there's no telling where pointers will be pointing in what case, since that isn't specified. You should always set your pointers to NULL no matter what.


Chance, that's what's happening. Nobody says uninitialized, non-static memory needs to hold any value. Both could contain anything.

  • In the first case it simply happened that malloc returned memory from an erased page (so it contains 0)
  • In the second case there was stuff on the stack so the memory contains garbage


In both cases the contents of temp will be uninitialized (random) data. They can be null, or non-null. No matter how consistently you get the same values, don't rely on that unless the documentation specifically states what they must be.

0

精彩评论

暂无评论...
验证码 换一张
取 消