Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么sizeof在尚不存在的变量上成功?_C_Esp32 - Fatal编程技术网

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

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

今天我在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;
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,尽管它可以编译。