这里我们有一个结构体,然后,我们使用malloc分配它的实例:
typedef struct _MyStruct {
struct *nextStruct;
char array[4];
} MyStruct
/* Allocates space on heap for the struct */
_MyStruct *m = malloc(sizeof(MyStruct));
printf("%zu bytesn", 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 OS实现。
当我们填充字符串"abcde"(5 个字节(时,我们会溢出结构内部的 char 数组,该数组驻留在堆栈上。
否,结构及其关联元素是通过 malloc
动态创建的。 所以整个结构,包括 char 数组都位于堆上。
你正在覆盖堆上结构的地址,而不是堆本身的结构,假设你的意思是指向下一个结构的指针