значение указателя по умолчанию. - PullRequest
12 голосов
/ 30 августа 2011

Смотри,

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

сейчас этап 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 != NULL)
    printf("b is not null\n");
else
    printf("b is null\n");

вывод:

a is null
b is null

сейчас этап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");

вывод:

a is not null
b is not null

почему это происходит?

Ответы [ 4 ]

40 голосов
/ 30 августа 2011

Указатели не имеют значения по умолчанию.Значение, которое они имеют, это то, что мусор был в памяти, которую они используют сейчас.Иногда определенный компилятор обнуляет память, но это не стандартно, поэтому не рассчитывайте на это.)

Память от malloc, равная NULL, была совпадением;это могло бы быть любое другое значение так же легко.Вам нужно и всегда нужно вручную устанавливать все ваши указатели на NULL.

Другой вариант - вы также можете использовать calloc, который делает то же самое, что и malloc, но устанавливает все биты в 0 в блоке памяти, который он вам дает.,Это не помогает с переменными стека, поэтому вам все равно придется установить их в NULL самостоятельно.

7 голосов
/ 30 августа 2011

Это полностью зависит от операционной системы, нет информации о том, куда в каком случае будут указывать указатели, поскольку это не указано.Вы должны всегда устанавливать свои указатели в NULL, несмотря ни на что.

3 голосов
/ 30 августа 2011

Шанс, вот что происходит. Никто не говорит, что неинициализированная, нестатическая память должна содержать любое значение. Оба могут содержать что угодно.

  • В первом случае просто так получилось, что malloc вернул память со стертой страницы (поэтому она содержит 0)
  • Во втором случае в стеке было что-то, поэтому в памяти содержится мусор
2 голосов
/ 30 августа 2011

В обоих случаях содержимое temp будет неинициализированными (случайными) данными.Они могут быть нулевыми или ненулевыми.Независимо от того, насколько последовательно вы получаете одинаковые значения, не полагайтесь на это, если в документации не указано, какими они должны быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...