C语言结构体定义及链表元素创建内存分配方式的疑问
链表元素创建函数malloc参数正误解答
你的理解完全正确,第二种createElem2中的malloc写法是错误的,具体分析如下:
- 分配内存的核心逻辑是:需要存储什么类型的数据,就要申请对应类型大小的内存。我们要存储完整的
struct elem结构体实例,自然需要申请sizeof(struct elem)大小的空间。 sizeof(struct elem*)获取的是指针类型本身的大小:无论指向的结构体内容是什么,指针在32位系统下固定占4字节、64位系统下固定占8字节,远小于完整struct elem结构体的占用空间(一般是int大小加指针大小,常见为8~16字节)。
使用malloc(sizeof(struct elem*))申请的内存不足以存储结构体的data和next两个成员,后续对(*temp).data、(*temp).next赋值时会越界访问未被分配的内存区域,属于C语言中的未定义行为:可能运气好暂时没有触发崩溃,也可能直接导致程序异常退出,甚至篡改其他变量的数据造成逻辑错误,是完全不可取的错误写法。你看到的课程讲师写第二种写法大概率是手误,不要效仿这类错误写法。
另外更推荐的malloc写法是使用sizeof(*指针变量)自动推导所需空间,示例如下:
temp = malloc(sizeof(*temp));
这种写法不需要手动匹配类型,哪怕后续listEl对应的类型发生了修改,也不需要调整sizeof内的参数,能从写法上避免这类大小匹配错误。
内容的提问来源于stack exchange,提问作者PwNzDust
相关产品推荐
相关产品推荐

