C sizeof的返回值
我有一个XDR结构:C sizeof的返回值,c,linux,sizeof,C,Linux,Sizeof,我有一个XDR结构: struct Response { bool_t error; float result; }; typedef struct Response Response; 在我看来: Response y; y.result = 5.7; y.error = 0; fprintf(f,"y.error's size: %d bit\n",sizeof(y.error)); 我在我的txt文件中获得: y.error's size: 0 bit 更多: 我
struct Response {
bool_t error;
float result;
};
typedef struct Response Response;
在我看来:
Response y;
y.result = 5.7;
y.error = 0;
fprintf(f,"y.error's size: %d bit\n",sizeof(y.error));
我在我的txt文件中获得:
y.error's size: 0 bit
更多:
我已经用rpcgen创建了一个XDR结构(结构响应)。我使用套接字将此结构发送到客户端:
XDR xdrs_w;
Response y;
FILE *stream_socket_w = fdopen(s, "w"); /* s is socket's file descriptor */
xdrstdio_create(&xdrs_w, stream_socket_w, XDR_ENCODE);
y.result = 6.8;
y.error = 0; /* false */
if(!xdr_Response(&xdrs_w, &y)){
printf("Error");
}
fflush(stream_socket_w);
问题在于xdr\u Response
功能。因此,我认为错误在于y.error=0
\include
#include <stdio.h>
typedef unsigned char bool_t;
struct Response {
bool_t error;
float result;
};
typedef struct Response Response;
int main(int argc, char *argv[]) {
Response r;
r.result = 5.7;
r.error = 0;
printf("y.error's size: %zu bytes\n", sizeof(r.error));
return 0;
}
typedef无符号字符集;
结构响应{
布尔误差;
浮动结果;
};
typedef结构响应;
int main(int argc,char*argv[]){
响应r;
r、 结果=5.7;
r、 误差=0;
printf(“y.error的大小:%zu字节\n”,sizeof(r.error));
返回0;
}
这对我来说就像预期的一样。bool_t不是标准类型,所以我输入了def。还请记住,在64位平台上,sizeof()返回无符号long,因此您需要在fprintf函数中使用%ld。
sizeof
返回字节大小,而不是位,我不能这样做。你能发布一个显示问题行为的函数吗?顺便说一句:sizeof不是一个函数,而是一个(一元)运算符。它不返回值,但(应用它)计算或生成值。其计算结果的类型是size\u t
,而不是int。您应该使用适当的格式说明符来打印size\u t
值<代码>%d不是正确的。使用%zu
或至少将size\u t
值强制转换为int
。无论如何,你发布的结果令人难以置信。你需要提供更多的细节。什么是bool\u t
?我已经更新了我的问题(针对phihag)您是否在big-endian机器(SPARC、PPC等)上运行?如果是这样,您看到的是当您将类型格式%d
与值(size\u t
)不匹配时所期望的结果。如果sizeof(size\u t)!=sizeof(int)
,在big-endian机器上,您将打印0。要获得正确的结果,请使用C99格式%zu
,或将sizeof()
的值强制转换为int
,以匹配您使用的%d
。%ld
不是大小的正确格式说明符。转换为int并使用%d
,或转换为unsigned int并使用%u
,或使用%zu
说明符格式化大小。(注意:sizeof(size\u t)
可能不同于sizeof(long int)
)您是对的,根据1999年ISO C标准(C99),size\u t是一种至少16位的无符号整数类型(参见第7.17节和第7.18.3节)。%zu是正确的说明符。顺便说一句:size_t是在c89/c90中引入的。c99中引入了%zu
z格式修饰符。而且一直没有签名。