【发布时间】: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;
根据我目前所了解的。这些肯定是正确的吗?
当我们填充字符串 'abcde'(5 个字节)时,我们超出了结构内部的 char 数组,该数组位于堆栈中。
如果我们插入字符串 'abcdefghi'(9 个字节),我们会超出结构本身,我假设它在堆上。但是我们也溢出了栈上的 char 数组。
编辑:更准确地说,这个问题基于 C99 标准,由 i686 操作系统实现
【问题讨论】:
-
不,包含 char 数组的 struct m 完全在堆上,而不是在栈上。如果你有一个堆......或一个堆栈......或其他任何东西;)
-
C语言中没有栈
-
@Roizpi:请提供有关堆栈和堆的标准参考。您混淆了特定 实现和语言。合规实施不需要任何内容。而且 x86、ARM、MIPS 等的大多数实现并不总是使用堆栈。
-
堆栈溢出链接不是对标准的引用。在做出错误假设之前获得一本更好的书或进行适当的研究怎么样?如果您从老师/教授那里得到它们:您应该要求权威参考。并了解未定义的行为。询问您显示的代码的行为方式/原因是没有用的。只是无法全面回答。
-
@MFisherKDX:我通常不回复侮辱性帖子。然而,对于初学者来说,理解并正确理解抽象层是最重要的。 OP 已经从一个错误的假设开始。堆栈跟踪是非常不同的东西,并且是实现的一部分。调用堆栈(堆栈跟踪是关于什么)和为实现分配局部变量的位置之间也存在差异,这些实现确实使用堆栈(例如,现代 x86/64 实现/ABI 不使用堆栈通常是所有局部变量)。请记住,发帖人应该了解问题
标签: c malloc overflow heap-memory