You need to enable JavaScript to run this app. C语言malloc分配结构体数组时出现堆缓冲区溢出问题求助
优惠活动
大模型
产品
解决方案
定价
更多

C语言malloc分配结构体数组时出现堆缓冲区溢出问题求助

问题原因及修复方案

1. 结构体内存对齐导致分配大小计算错误

你认为node_stru的大小是256+4=260字节,4个实例总大小1040字节,这是忽略了C语言结构体内存对齐规则的错误计算:

  • 大多数编译器默认会对结构体成员做地址对齐,256字节的char数组结束后,后续的填充位会让整个结构体大小对齐到8字节(64位系统默认对齐单位),因此单个node_stru的实际大小是264字节,4个实例总大小为264*4=1056字节,你只分配了1040字节,自然会出现越界。
  • 永远不要手动计算结构体大小,直接用sizeof(node_stru)来获取即可,你原本的malloc写法本身是对的,不要手动替换成固定数值。

2. 链表节点数超出分配的数组长度

你分配的node_list长度是n_nodenumber,如果遍历的链表实际节点数大于n_nodenumber,n_index自增后会超出数组的合法下标范围,直接访问到数组外的堆内存,触发溢出。
建议修复循环逻辑:

llnode* ptr = Ahead;
// 增加边界判断,n_index不超过n_nodenumber-1
while (ptr != NULL && n_index < n_nodenumber) {
  printf("the name%s, the index%d", ptr->llnodename, ptr->ll_index);
  // 替换strcpy为更安全的strncpy,避免字符串溢出
  strncpy(node_list[n_index].nodename, ptr->llnodename, sizeof(node_list[n_index].nodename) - 1);
  node_list[n_index].nodename[sizeof(node_list[n_index].nodename) - 1] = '\0';
  node_list[n_index].node_index = ptr->ll_index;
  n_index++;
  ptr = ptr->next;
}

3. malloc写法优化

C语言中malloc返回的void*可以隐式转换为任意指针类型,不需要强制类型转换,强转反而会隐藏你忘记引入stdlib.h头文件的报错,同时一定要加内存分配失败的判断:

node_stru *node_list = malloc(n_nodenumber * sizeof(node_stru));
if (node_list == NULL) {
  perror("malloc failed");
  return -1;
}

内容的提问来源于stack exchange,提问作者Punici

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 02:54:09