为什么 sizeof 在尚未存在的变量上成功?

Why sizeof succeeds on not yet exsisting variable?

今天我遇到了 ESP32 上损坏的堆的问题。事实证明,错误是由这一行引起的:

u8x8_i2c_cmdinfo* cmdinfo = malloc(sizeof(cmdinfo));

当我的意思

u8x8_i2c_cmdinfo* cmdinfo = malloc(sizeof(u8x8_i2c_cmdinfo));

编译错误的版本实际上让我很惊讶。

为什么有效?它实际上做了什么?

代码编译通过,因为变量在其声明之后存在。这部分只是声明它:u8x8_i2c_cmdinfo* cmdinfo.

如果这有效,您不会感到惊讶,对吗?

u8x8_i2c_cmdinfo* cmdinfo;
cmdinfo = malloc(sizeof(cmdinfo));

请记住,虽然您的代码可以正常编译,但它有一个严重的错误。您正在为指针的大小分配 space,很可能不是您想要的。