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