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

malloc-C程序-将值0分配给gcc中的整数,gcc,malloc,visual-c++,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

我有一个这样的链表结构

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中执行相同的打印列表时没有收到相同的错误?

malloc返回的内存内容未初始化。在初始化该内存之前(至少写入一次),无法读取该内存

gcc可能是“有帮助的”零初始化内存,但这种行为不是必需的。VisualC++运行时(CRT)将在发布版本中给您初始化内存(以达到最大性能),并在调试生成中用特殊填充字节<代码> 0xCD < /Cube初始化内存(以帮助您找到可能使用未初始化内存的地方)。
因此,基本上,您需要在使用内存之前对其进行初始化。如果希望运行时在将堆块提供给您之前对其进行零初始化,则可以使用
calloc

malloc
返回的内存内容初始化。在初始化该内存之前(至少写入一次),无法读取该内存

gcc可能是“有帮助的”零初始化内存,但这种行为不是必需的。VisualC++运行时(CRT)将在发布版本中给您初始化内存(以达到最大性能),并在调试生成中用特殊填充字节<代码> 0xCD < /Cube初始化内存(以帮助您找到可能使用未初始化内存的地方)。
因此,基本上,您需要在使用内存之前对其进行初始化。如果希望运行时在将堆块提供给您之前将其初始化为零,则可以使用
calloc

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

您需要分配
new\u node->next=NULL
,因为您检查当前节点是否为NULL,并且
malloc
不会使用任何值初始化分配的空间,因此,无法保证该值会被初始化。为了安全起见,您需要手动为链表的尾部或无效指针指定NULL