我用 malloc
分配内存给指向 struct
的指针,但我没有给实际的结构分配任何东西。但是我可以访问/使用 struct
。
typedef struct A
{
int w;
int x;
int y;
int z;
}A;
int main(void)
{
A* a = malloc(sizeof(A*)); //Here I allocate memory just to pointer to A
//Why can I do this than?:
a->z = 10;
a->w = 456;
return 0;
}
为什么会这样? 这只是巧合还是它总是应该以这种方式工作? 一些注意事项:
我不能用非动态分配来做到这一点
在 repl.it 中测试
最佳答案
当你这样做时:
A* a = malloc(sizeof(A*));
您没有为 A
的实例分配足够的内存。因此,如果您读/写任何成员恰好位于实际分配的范围之外,您将调用 undefined behavior .
对于未定义的行为,您无法准确预测程序的输出。它可能会崩溃,可能会输出奇怪的结果,或者(在您的情况下)它可能看起来工作正常。未定义的行为 list 如何通过进行看似无关的修改(例如额外的局部变量、调用 printf
进行调试)或通过使用不同的选项重新编译来改变。
仅仅因为一个程序可能崩溃并不意味着它将会。
如果您使用诸如 valgrind 之类的工具,它可以在您不正确地使用内存时捕获,例如在您的示例中。
关于c - 分配指向结构的指针,但不是实际的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48631179/