使用 sizeof 运算符时的意外行为

asd*_*sds 3 c sizeof

#include <stdio.h>
#include <stdlib.h>

typedef struct StupidAssignment{
    long length;
    char* destination_ip;
    char* destination_port;
    long timestamp;
    long uid;
    char* message;
}packet;

void main(){
    int number_of_packets=10;int i;
    packet* all_packets[number_of_packets];
    for(i=0;i<number_of_packets;i+=1)all_packets[i]=malloc(sizeof packet);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码片段不会编译,并出现以下错误:-

reciever.c: In function ‘main’:
reciever.c:16:64: error: expected expression before ‘packet’
  for(i=0;i<number_of_packets;i+=1)all_packets[i]=malloc(sizeof packet);
Run Code Online (Sandbox Code Playgroud)

但是,以下代码确实可以编译:-

#include <stdio.h>
#include <stdlib.h>

typedef struct StupidAssignment{
    long length;
    char* destination_ip;
    char* destination_port;
    long timestamp;
    long uid;
    char* message;
}packet;

void main(){
    int number_of_packets=10;int i;
    packet* all_packets[number_of_packets];
    for(i=0;i<number_of_packets;i+=1)all_packets[i]=malloc(sizeof(packet));
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是sizeof(packet)sizeof packet

在上一个答案中,我了解到这sizeof只是一个运算符,return因此括号是可选的。

我显然错过了一些东西,所以有人可以向我解释这种行为吗?

rtx*_*x13 6

sizeof运算符与类型一起使用时,必须将类型放在括号中。

sizeof运算符与变量一起使用时,您可以省略括号。


参见§6.5.3 一元运算符§6.5.3.4 C11 草案中的 sizeof 和 _Alignof 运算符。感谢@JonathanLeffler 识别这些部分。

  • 但由于括号总是有效,而省略括号有时不起作用,因此始终使用括号是合理的,然后您就不需要了解特殊情况。并不是每个人都同意这个观点,但我已经坚持这个观点 30 多年了,并且没有因此遇到任何困难——除了少数人(强烈地)认为你应该尽可能省略括号。 (7认同)
  • 是的..我从来不理解那些不断检查优先级表以尝试正确编写复杂表达式的开发人员,而他们可以直接将其放入括号中,无论是否多余。与 sizeof() 相同 (3认同)
  • 您可以链接到 C11 [§6.5.3 一元运算符](http://port70.net/~nsz/c/c11/n1570.html#6.5.3) 和 [§6.5.3.4 sizeof 和 _Alignof 运算符]( http://port70.net/~nsz/c/c11/n1570.html#6.5.3.4)。 (2认同)