malloc - программа C - выделяет значение 0 целому числу в gcc - PullRequest
0 голосов
/ 08 мая 2011

У меня есть структура связанного списка, подобная этой

typedef struct list_node {
    int data;
    struct list_node *next;
}l_node;

void print_list(l_node *head) {
    l_node *cur_node = head;
    while(cur_node!=NULL) {
        printf("%d\t", cur_node->data);
        cur_node = cur_node->next;
    }
}

void main() {
    printf("List");
    l_node *new_node = (l_node*)malloc(sizeof(l_node));
    print_list(new_node);
}

Когда я компилирую gcc connectedlist.c и делаю ./a.out Я получаю вывод Список 0

Но когда я попробовал это в VC ++, я получил ошибку (так как я пытаюсь получить доступ к недопустимому месту в памяти в cur_node-> next ).

Итак, malloc из gcc выделяет по умолчанию значение 0 для целочисленной переменной внутри структуры? Почему я не получил ту же ошибку при выполнении того же print_list в gcc?

Ответы [ 2 ]

2 голосов
/ 08 мая 2011

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

gcc может «услужливо» инициализировать память нулем, но такое поведение не требуется. Visual C ++ C Runtime (CRT) предоставит вам неинициализированную память в сборке выпуска (для максимальной производительности) и память, инициализированную специальным байтом заполнения 0xcd в сборке отладки (чтобы помочь вам найти, где вы можете использовать неинициализированную память) .

Итак, в основном вам нужно инициализировать память перед ее использованием. Если вы хотите, чтобы среда выполнения инициализировала блок кучи до нуля до того, как он вам его даст, вы можете использовать calloc.

1 голос
/ 08 мая 2011

вам нужно присвоить new_node->next = NULL, потому что вы проверяете, является ли текущий узел NULL или нет, а malloc не инициализирует выделенное пространство каким-либо значением, поэтому нет гарантии, что значение будет инициализировано. Для безопасности вам необходимо вручную присвоить NULL хвосту связанного списка или неверному указателю.

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