尝试 malloc 结构数组,但堆缓冲区溢出

Posted

技术标签:

【中文标题】尝试 malloc 结构数组,但堆缓冲区溢出【英文标题】:try to malloc a struct array, but get heap buffer overflow 【发布时间】:2021-08-24 07:59:02 【问题描述】:

我是编程新手,刚刚学习了 C。现在我的问题是,我试图 malloc 一个结构数组,然后用它来填写一些信息。但不断收到堆溢出错误报告。 这是我在 h.file 中声明的结构。

typedef struct llnode 
  char llnodename[256];
  int ll_index;
  struct llnode* next;
 llnode;
//the struct of a linked list.

typedef struct node_stru 
  char nodename[256];
  int node_index;
 node_stru;
//the struct of the node.

和指针:

node_stru *node_list = (struct node_stru*)malloc(n_nodenumber*(sizeof(node_stru)));

但后来当我想使用链表填写一些信息时,它给了我堆溢出。

llnode* ptr=Ahead;
while (ptr!=NULL)
  printf("the name%s, the index%d", ptr->llnodename, ptr->ll_index);
  strcpy(node_list[n_index].nodename, ptr->llnodename);
  node_list[n_index].node_index = ptr->ll_index;
  n_index++;
  ptr = ptr->next;

报错:我做了 malloc 一个 4*(256+4) 的内存,但还是不行。

0x619000000490 is located 0 bytes to the right of 1040-byte region [0x619000000080,0x619000000490)

【问题讨论】:

显示minimal reproducible example。 欢迎来到 Stack Overflow。请阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist。最后,请学习如何edit 您的问题以改进它们,例如向我们展示minimal reproducible example。还请在您的程序中包含可能的输入,或硬编码变量的值,例如n_nodenumber 没有什么能阻止循环从 node_list 的末端走出来。 【参考方案1】:

您已经为node_list 分配了一个固定大小,但是没有什么可以阻止您的循环走到尽头。例如,如果n_nodenumber 为 4,您可以存储 4 个节点。但是如果Ahead 链接到 5 个节点,它将离开node_list。假设n_index 从 0 开始。

您的循环至少应该assert(n_index < n_nodenumber) 以在循环离开数组时提供更好的错误。没有看到完整的例子,我只能这么说。

【讨论】:

谢谢,但是n_nodenumber是链表的结果,链表有4个节点,节点表也有4个节点需要填写。

以上是关于尝试 malloc 结构数组,但堆缓冲区溢出的主要内容,如果未能解决你的问题,请参考以下文章

缓冲区溢出详解

是否有任何工具可以检测 Visual C++ 6.0 上的缓冲区溢出? [关闭]

全面解析UNIX缓冲区溢出 深度防御体系

__m256 数组上的 Visual Studio 2019 C6385 / C6386(缓冲区溢出警告)

NSData 转换上的堆缓冲区溢出

c++缓冲区溢出问题