【问题标题】:Where on memory are struct fields allocated if we allocate struct with malloc? [closed]如果我们用 malloc 分配结构体,结构体字段在内存上分配在哪里? [关闭]
【发布时间】:2017-11-13 23:00:32
【问题描述】:

这里我们有一个结构,然后,我们用 malloc 分配它的一个实例:

typedef struct _MyStruct {
    struct *nextStruct;
    char array[4];
} MyStruct

/* Allocates space on heap for the struct */
_MyStruct *m = malloc(sizeof(MyStruct));
printf("%zu bytes\n", sizeof(MyStruct)); /* Outputs: 8 bytes */

int r;

/* We intentionally overflow the buffer inside of the struct */
r = (int)gets(m->array); /* Input */
    if (r == 0)
         return;

根据我目前所了解的。这些肯定是正确的吗?

  1. 当我们填充字符串 'abcde'(5 个字节)时,我们超出了结构内部的 char 数组,该数组位于堆栈中。

  2. 如果我们插入字符串 'abcdefghi'(9 个字节),我们会超出结构本身,我假设它在堆上。但是我们也溢出了栈上的 char 数组。

编辑:更准确地说,这个问题基于 C99 标准,由 i686 操作系统实现

【问题讨论】:

  • 不,包含 char 数组的 struct m 完全在堆上,而不是在栈上。如果你有一个堆......或一个堆栈......或其他任何东西;)
  • C语言中没有栈
  • @Roizpi:请提供有关堆栈和堆的标准参考。您混淆了特定 实现和语言。合规实施不需要任何内容​​。而且 x86、ARM、MIPS 等的大多数实现并不总是使用堆栈。
  • 堆栈溢出链接不是对标准的引用。在做出错误假设之前获得一本更好的书或进行适当的研究怎么样?如果您从老师/教授那里得到它们:您应该要求权威参考。并了解未定义的行为。询问您显示的代码的行为方式/原因是没有用的。只是无法全面回答。
  • @MFisherKDX:我通常不回复侮辱性帖子。然而,对于初学者来说,理解并正确理解抽象层是最重要的。 OP 已经从一个错误的假设开始。堆栈跟踪是非常不同的东西,并且是实现的一部分。调用堆栈(堆栈跟踪是关于什么)和为实现分配局部变量的位置之间也存在差异,这些实现确实使用堆栈(例如,现代 x86/64 实现/ABI 不使用堆栈通常是所有局部变量)。请记住,发帖人应该了解问题

标签: c malloc overflow heap-memory


【解决方案1】:

当我们填充字符串 'abcde'(5 个字节)时,我们超出了结构内部的 char 数组,该结构位于堆栈中。

不,结构及其关联元素是通过malloc 动态创建的。所以整个结构,包括 char 数组都在堆上。

【讨论】:

  • 我真的可以用这个答案快速地继续我的工作。问题是我现在不能花很多时间调试和分析内存地址。但我现在可以弄清楚一切。谢谢!
  • 那么当覆盖 char 数组时,在堆上覆盖的是单独的 char 数组?
  • 没有。如果覆盖 char 数组的边界,则会导致未定义的行为——可能会破坏超出它的任何内存。由于 C 不允许编译器对结构的元素重新排序,因此您不应期望同一结构的 nextstruct 指针值被破坏——因为它位于较低的内存地址。然而,因为这是 UB,任何事情都可能发生
【解决方案2】:

假设你的意思是指向下一个结构的指针,你正在覆盖堆上结构的地址,而不是堆本身的结构

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 2021-05-13
    • 2015-01-05
    • 2015-06-27
    • 2015-11-09
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    相关资源
    最近更新 更多