使用 sizeof 运算符时的意外行为
Unexpected behaviour when using sizeof operator
#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);
}
上面的代码片段没有编译并出现以下错误:-
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);
但是,下面的代码编译通过:-
#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));
}
唯一的区别是 sizeof(packet)
和 sizeof packet
。
在之前的回答中,我了解到 sizeof
只是一个像 return
这样的运算符,所以括号是可选的。
我显然错过了一些东西,有人可以向我解释一下这种行为吗?
当对类型使用 sizeof
运算符时,必须将类型放在括号中。
对变量使用 sizeof
运算符时,可以省略括号。
请参阅 C11 草案中的 §6.5.3 Unary operators and §6.5.3.4 The sizeof and _Alignof operators。感谢@JonathanLeffler 识别这些部分。
sizeof
是运算符。它只是使用括号来区分数据类型和变量。
sizeof packet; //Error
sizeof(packet); //Compiles
packet p;
sizeof p; //No error
根据 documentation:
sizeof( type )
sizeof expression
所以,类型需要括号,表达式不需要。
#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);
}
上面的代码片段没有编译并出现以下错误:-
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);
但是,下面的代码编译通过:-
#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));
}
唯一的区别是 sizeof(packet)
和 sizeof packet
。
在之前的回答中,我了解到 sizeof
只是一个像 return
这样的运算符,所以括号是可选的。
我显然错过了一些东西,有人可以向我解释一下这种行为吗?
当对类型使用 sizeof
运算符时,必须将类型放在括号中。
对变量使用 sizeof
运算符时,可以省略括号。
请参阅 C11 草案中的 §6.5.3 Unary operators and §6.5.3.4 The sizeof and _Alignof operators。感谢@JonathanLeffler 识别这些部分。
sizeof
是运算符。它只是使用括号来区分数据类型和变量。
sizeof packet; //Error
sizeof(packet); //Compiles
packet p;
sizeof p; //No error
根据 documentation:
sizeof( type )
sizeof expression
所以,类型需要括号,表达式不需要。