c - 分配指向结构的指针,但不是实际的结构

标签 c pointers struct sizeof dynamic-allocation

我用 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;
}

为什么会这样? 这只是巧合还是它总是应该以这种方式工作? 一些注意事项:

  1. 我不能用非动态分配来做到这一点

  2. repl.it 中测试

最佳答案

当你这样做时:

A* a = malloc(sizeof(A*));

您没有为 A 的实例分配足够的内存。因此,如果您读/写任何成员恰好位于实际分配的范围之外,您将调用 undefined behavior .

对于未定义的行为,您无法准确预测程序的输出。它可能会崩溃,可能会输出奇怪的结果,或者(在您的情况下)它可能看起来工作正常。未定义的行为 list 如何通过进行看似无关的修改(例如额外的局部变量、调用 printf 进行调试)或通过使用不同的选项重新编译来改变。

仅仅因为一个程序可能崩溃并不意味着它将会

如果您使用诸如 valgrind 之类的工具,它可以在您不正确地使用内存时捕获,例如在您的示例中。

关于c - 分配指向结构的指针,但不是实际的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48631179/

相关文章:

c - GDB位移命令

c++ - 为什么当我使用不同版本的 GCC 时使用 strtok 函数时出现此错误?

C++ 引用结构数组

C:复制结构/数组元素

c - C 中的简单链表函数

c++ - 关于 C 与 C++ 中的结构变量声明

c - 列表头 : get garbage if start parsing from second element

c - 列表C中字符串的动态内存分配

c - Fork 和 dup2 - 子进程未终止 - 文件描述符问题?

c - 如何遍历文本,将文件中的数据读入 c 中的多个变量?