malloc - C程序 - 在gcc中将值0分配给整数

时间:2011-05-08 05:02:56

标签: gcc malloc visual-c++

我有像这样的链表结构

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 linkedlist.c并执行./a.out时 我得到输出 名单 0

但是当我在VC ++中尝试时,我收到错误(因为我试图访问 cur_node-> next 中的无效内存位置)。

那么,gcc的malloc默认是否将0值分配给结构内的整数变量?为什么我在gcc中执行相同的print_list时没有得到相同的错误?

2 个答案:

答案 0 :(得分:2)

malloc返回的内存内容未初始化。在初始化之前你不能从那个内存中读取(至少写一次)。

gcc可能“有用”地初始化内存,但不需要这种行为。 Visual C ++ C运行时(CRT)将在发布版本中为您提供未初始化的内存(以获得最佳性能),并在调试版本中使用特殊填充字节0xcd初始化内存(以帮助您找到未初始化的位置)存储器)。

因此,基本上,您需要在使用之前初始化内存。如果您希望运行时在将堆块提供给您之前对其进行零初始化,则可以使用calloc

答案 1 :(得分:1)

您需要分配new_node->next = NULL,因为您检查当前节点是否为NULL,并且malloc没有使用任何值初始化已分配的空间,因此没有保证该值将是初始化。为了安全起见,您需要手动将NULL分配给链表的尾部或无效的指针。