如果我们使用malloc分配struct,那么内存中是否分配了struct字段?

时间:2017-11-13 23:00:33

标签: c malloc overflow heap-memory

这里我们有一个struct,然后,我们用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数组。

  3. 编辑:为了更准确,此问题基于C99标准,由i686 O.S。

    实施。

2 个答案:

答案 0 :(得分:0)

  

当我们填充字符串'abcde'(5个字节)时,我们溢出了存在于堆栈中的struct内的char数组。

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

答案 1 :(得分:-1)

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