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;
}
编译器对于直接输出 s 对象,应该取的是指针所指向的对象长度,也就是字符串"ABCDE";
对于运算 (s+0),则按照指针对象解析长度,在32位机上解析为4字节。
你的编译器应该开了64bit选项,默认指针类型都是按照8字节占用空间的。你可以试试你默认声明 int 型和 long 型变量,sizeof() 的结果分别是多少。