Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我们使用malloc分配struct,那么在内存中的什么位置分配struct字段?_C_Malloc_Overflow_Heap Memory - Fatal编程技术网

如果我们使用malloc分配struct,那么在内存中的什么位置分配struct字段?

如果我们使用malloc分配struct,那么在内存中的什么位置分配struct字段?,c,malloc,overflow,heap-memory,C,Malloc,Overflow,Heap Memory,这里我们有一个结构,然后,我们用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)); /* Output

这里我们有一个结构,然后,我们用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个字节)时,我们会溢出位于堆栈上的结构内部的字符数组

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

  • 编辑:更准确地说,这个问题基于C99标准,由i686 O.S.实施

    当我们填充字符串'abcde'(5个字节)时,我们会溢出位于堆栈上的结构内部的字符数组


    否,结构及其关联元素是通过
    malloc
    动态创建的。因此,整个结构(包括字符数组)都位于堆上。

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

    否,包含字符数组的结构m完全位于堆上,而不是堆栈上。如果你有一堆。。。或者一堆。。。或者随便什么;)C语言中没有堆栈。@Roizpi:请提供有关堆栈和堆的标准参考。您会混淆特定的实现和语言。符合要求的实现不需要任何内容。大多数x86、ARM、MIPS等的实现并不总是使用堆栈。堆栈溢出链接不是对标准的引用。在做出错误的假设之前,找一本更好的书或者做适当的研究怎么样?如果你是从老师/教授那里得到的:你应该要求权威的推荐人。并了解未定义的行为。询问您显示的代码的行为方式/原因是没有用的。只是不可能全面地回答。@MFisherKDX:我通常不会回复侮辱性的帖子。然而,对于初学者来说,理解并正确理解抽象层是最重要的。OP一开始就有一个错误的假设。堆栈跟踪是非常不同的东西,也是实现的一部分。调用堆栈(堆栈跟踪的内容)和为使用堆栈的实现分配局部变量(例如,现代x86/64实现/ABI通常不为所有局部变量使用堆栈)之间也存在差异。请记住,海报应该能够理解这个问题。我真的可以用这个答案迅速地继续我的工作。问题是我现在不能花很多时间调试和分析内存地址。但我现在能搞定一切了。非常感谢。因此,当重写char数组时,堆上的重写对象是单独的char数组?否。如果覆盖char数组的边界,则会导致未定义的行为——可能会损坏超出它的内存。由于C不允许编译器对结构的元素重新排序,因此您不应该期望同一结构的
    nextstruct
    指针值被损坏,因为它位于较低的内存地址。然而,因为这是UB,任何事情都可能发生。