C 为什么sizeof在尚不存在的变量上成功?
今天我在ESP32上遇到了一些问题。事实证明,错误是由以下行引起的:C 为什么sizeof在尚不存在的变量上成功?,c,esp32,C,Esp32,今天我在ESP32上遇到了一些问题。事实证明,错误是由以下行引起的: u8x8_i2c_cmdinfo* cmdinfo = malloc(sizeof(cmdinfo)); 我的意思是 u8x8_i2c_cmdinfo* cmdinfo = malloc(sizeof(u8x8_i2c_cmdinfo)); 事实上,我很惊讶编译的版本竟然是错误的 为什么它能工作?它实际上是做什么的?代码编译是因为变量在声明之后存在。这部分刚刚声明:u8x8\u i2c\u cmdinfo*cmdinfo
u8x8_i2c_cmdinfo* cmdinfo = malloc(sizeof(cmdinfo));
我的意思是
u8x8_i2c_cmdinfo* cmdinfo = malloc(sizeof(u8x8_i2c_cmdinfo));
事实上,我很惊讶编译的版本竟然是错误的
为什么它能工作?它实际上是做什么的?代码编译是因为变量在声明之后存在。这部分刚刚声明:
u8x8\u i2c\u cmdinfo*cmdinfo
如果这奏效,你不会感到惊讶,对吗
u8x8_i2c_cmdinfo* cmdinfo;
cmdinfo = malloc(sizeof(cmdinfo));
请记住,虽然您的代码编译得很好,但它有一个令人讨厌的bug。您正在为指针的大小分配空间,很可能不是您想要执行的操作。代码会编译,因为变量在其声明之后存在。这部分刚刚声明:
u8x8\u i2c\u cmdinfo*cmdinfo
如果这奏效,你不会感到惊讶,对吗
u8x8_i2c_cmdinfo* cmdinfo;
cmdinfo = malloc(sizeof(cmdinfo));
请记住,虽然您的代码编译得很好,但它有一个令人讨厌的bug。你为指针的大小分配空间,很可能不是你想做的。 >代码> siZeof(CMDIfNo)< /C>是指针的大小,不是它指向的大小。对于C++问题,它可能仍然有助于理解正在发生的事情。<代码> U8x8II2CYCMDFION*CMDIMPOR= MALOC(SIEZOF(CMDIOFN));code>是一个声明(
u8x8_i2c_cmdinfo*cmdinfo;
),后面是一个初始化(cmdinfo=malloc(sizeof(cmdinfo));
),组合在同一行中。在初始化时,变量已经声明。更确切的方法是使用变量已经存在的事实:<代码>类型*指针= Malc((siZoof(*指针)*num)< /C++ >,因为<代码> siZeof(CMDIfNo)< /C>是指针的大小,不是指针指向的大小。它可能仍然有助于理解正在发生的事情。u8x8_i2c_cmdinfo*cmdinfo=malloc(sizeof(cmdinfo))
是一个声明(u8x8_i2c_cmdinfo*cmdinfo;
),后面是一个初始化(cmdinfo=malloc(sizeof(cmdinfo));
),组合在同一行中。在初始化时,变量已经声明。执行此malloc的更惯用方法确实利用了变量已经存在的事实:type*pointer=malloc((sizeof(*pointer))*num)
FWIW,cmdinfo=malloc(sizeof(cmdinfo))代码>几乎总是错误的。我想你可能是指cmdinfo=malloc(sizeof(*cmdinfo))
@CarlNorum不,这正是我的意思,因为这是OP编写的代码-我用等效代码来说明它。我提到这是一个bug,尽管它编译.FWIW,cmdinfo=malloc(sizeof(cmdinfo))代码>几乎总是错误的。我想你可能是指cmdinfo=malloc(sizeof(*cmdinfo))
@CarlNorum不,这正是我的意思,因为这是OP编写的代码-我用等效代码来说明它。我提到这是一个bug,尽管它可以编译。