sizeof返回的值到底是什么?

Windows 10 64位, gcc 9.3

如果printf的格式参数写%d,编译器会提示sizeof返回的是unsigned long long int

结果显示sizeof(s)是6,应该是5个字母加一个结束字符'\0',一共6个字节

为什么sizeof(s+0)结果是8呢?或者为什么sizeof(s)不是8呢,在我这台电脑,用gcc,明显unsigned long long 字节是8

#include <stdio.h>
int main(){
char s[]="ABCDE";
printf("%I64u\n",sizeof(s));
printf("%I64u\n",sizeof(s+0));
return 0;
}

sizeof的用法是:sizeof(表达式)。

如果表达式是一个变量或常量,可以省略括号。否则,有括号、无括号的结果是不同的。作用是返回为表达式分配的字节数。

在本例中,s是字符数组,sizeof(s)返回6,说明为数组分配了6字节,你的理解是对的。

而在sizeof(s+2)中,s+2的结果是一个unsigned long long int类型的整数,sizeof返回的是为存储这种类型的整数需分配的字节数,在你的系统上,它就是8。

也就是说,sizeof(表达式)返回的值与表达式的结果的类型有关,另外sizeof返回的值本身的类型是unsigned long int的。

比如:

假设在一个系统上,int为4字节,long int为4字节,long long int为8字节,float为4字节,double为8字节。则,sizeof(1)返回4,sizeof(1L)返回8,sizeof(1LL)返回8。同时,sizeof(1+2)返回4,sizeof(1.0+2)返回8,而sizeof(1.0F+2)就会返回4。

下面是一个综合例子:

#include <stdio.h>

int main()

{

int a=1;

struct ss

{

int i;

char s[8];

}s1;

typedef ss s;

printf("%lu ",sizeof a);

printf("%lu ",sizeof 1);

printf("%lu ",sizeof(a+1));

printf("%lu ",sizeof a+1);

printf("%lu ",sizeof(1+2));

printf("%lu ",sizeof 1+2);

printf("%lu ",sizeof(1));

printf("%lu ",sizeof s1);

printf("%lu\n",sizeof(s));

printf("%lu ",sizeof((short)1));

printf("%lu ",sizeof(1L));

printf("%lu ",sizeof 1LL);

printf("%lu ",sizeof 1.0);

printf("%lu ",sizeof(1.0F));

printf("%lu ",sizeof 1.0d);

printf("%lu ",sizeof(1.0+2));

printf("%lu ",sizeof(1.0F+2));

printf("%lu\n",sizeof(1.0d+2));

return 0;

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-04-18
我在32位编译器上,用%d格式输出,结果分别是6和4。
编译器对于直接输出 s 对象,应该取的是指针所指向的对象长度,也就是字符串"ABCDE";
对于运算 (s+0),则按照指针对象解析长度,在32位机上解析为4字节。
你的编译器应该开了64bit选项,默认指针类型都是按照8字节占用空间的。你可以试试你默认声明 int 型和 long 型变量,sizeof() 的结果分别是多少。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网