我有像这样的链表结构
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时没有得到相同的错误?
答案 0 :(得分:2)
malloc
返回的内存内容未初始化。在初始化之前你不能从那个内存中读取(至少写一次)。
gcc可能“有用”地初始化内存,但不需要这种行为。 Visual C ++ C运行时(CRT)将在发布版本中为您提供未初始化的内存(以获得最佳性能),并在调试版本中使用特殊填充字节0xcd
初始化内存(以帮助您找到未初始化的位置)存储器)。
因此,基本上,您需要在使用之前初始化内存。如果您希望运行时在将堆块提供给您之前对其进行零初始化,则可以使用calloc
。
答案 1 :(得分:1)
您需要分配new_node->next = NULL
,因为您检查当前节点是否为NULL,并且malloc
没有使用任何值初始化已分配的空间,因此没有保证该值将是初始化。为了安全起见,您需要手动将NULL分配给链表的尾部或无效的指针。