C sizeof的返回值

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 更多: 我

我有一个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
更多:

我已经用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格式修饰符。而且一直没有签名。