Установка всех членов указателя структуры в NULL

Если я установлю указатель на структуру так, чтобы она указывала на блок памяти через malloc, будут ли все элементы инициализированы соответствующими значениями по умолчанию? Например, int на 0 и указатель на NULL? Я вижу, что они это делают, основываясь на этом образце кода, который я написал, поэтому я просто хотел, чтобы кто-нибудь подтвердил мое понимание. Спасибо за отзыв.

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
#include <stdlib.h>

typedef struct node
{
    bool value;
    struct node* next[5];
}
node;

int main(void)
{
    node* tNode = malloc(sizeof(node));

    printf("value = %i\n", tNode->value);

    for (int i = 0; i < 5; i++)
    {
        if (tNode->next[i] == NULL)
            printf("next[%i] = %p\n", i, tNode->next[i]);
    }
}

person de3z1e    schedule 19.01.2015    source источник
comment
Спасибо за вклад каждого. Я понимаю, что указатель, указывающий на новый блок памяти через malloc, не обязательно будет инициализирован NULL, однако мой вопрос заключается в том, почему элементы в массиве указателей-членов struct node* next[5] указывают на NULL? Они не были malloc'd. Я предполагаю, что мой вопрос будет заключаться в том, будет ли переменная-указатель (которая является членом структуры) всегда указывать на NULL до того, как она будет malloc'd?   -  person de3z1e    schedule 19.01.2015


Ответы (3)


malloc() никогда не инициализирует область памяти. Вы должны использовать calloc() для специальной инициализации области памяти нулями. Причина, по которой вы видите инициализированную память, объясняется здесь.

person sumithdev    schedule 19.01.2015
comment
Используйте calloc или обнулите значения самостоятельно (либо установив поля по отдельности, либо используя memset) - person user253751; 19.01.2015

malloc никогда не инициализирует выделенную память. На справочной странице:

Память не инициализирована.

Из стандарта C 7.20.3.3 Функция malloc:

Функция malloc выделяет место для объекта... значение которого неопределенно.

person Carl Norum    schedule 19.01.2015

Вы можете использовать ключевые слова static const для установки переменных-членов вашей структуры.

#включают

struct rabi 
{
int i;
float f;
char c;
int *p; 
};
int main ( void )
{

static const struct rabi enpty_struct;
struct rabi shaw = enpty_struct, shankar = enpty_struct;


printf ( "\n i = %d", shaw.i );
printf ( "\n f = %f", shaw.f );
printf ( "\n c = %d", shaw.c );
printf ( "\n p = %d",(shaw.p) );


printf ( "\n i = %d", shankar.i );
printf ( "\n f = %f", shankar.f );
printf ( "\n c = %d", shankar.c );
printf ( "\n p = %d",(shankar.p) );
return ( 0 );
}



Output:

 i = 0
 f = 0.000000
 c = 0
 p = 0

 i = 0
 f = 0.000000
 c = 0
 p = 0
person rabi shaw    schedule 19.01.2015