问题描述
对于 sizeof 运算符,我看到以下结果;我无法理解背后的原因。 我的理解是 sizeof 运算符根据 size_t 返回结果 结果如下,
sizeof("6") -> 2
sizeof("a") -> 2
sizeof('a') -> 4
sizeof("something") -> 10
sizeof("some") -> 5
解决方法
根据定义 (C11 3.6),1 个字符需要 1 个字节(在某些外来系统中可能不是 1 个八位字节)
"6"
的类型为 char[2]
,所以 2 个字节"a"
的类型为 char[2]
'a'
在您的系统中有 int
==> 类型,int
需要 4 个字节"something"
的类型为 char[10]
"some"
的类型为 char[5]
请注意,"a"
和 'a'
是非常不同的东西:"a"
是一个由 char
组成的数组,有 2 个元素; 'a'
是一个 int
值,非常类似于 42
或 -1
。
在这样的记录中
sizeof("6") -> 2
使用字符串文字作为操作数。
字符串文字是存储以零字符 '\0'
结尾的字符序列的字符数组。
例如字符串文字 "6"
存储在内存中,如
char literal_6[] = { '6','\0' };
或者这个声明等价于
char literal_6[2] = { '6','\0' };
注意:例如字符串文字“some”像声明为的字符数组一样存储在内存中
char literal_some[] = { 's','o','m','e','\0' };
所以表达式 sizeof("6")
等价于表达式 sizeof( char[2] )
。
在这个记录中
sizeof('a') -> 4
使用了类型为 '4'
的整数字符常量 int
。
所以这个表达式 sizeof('a')
等价于表达式 sizeof( int )
。
有趣的是,例如 sizeof("something")
不等于 sizeof("something" + 0)
。在最后一个表达式中,表示字符串文字的字符数组被隐式转换为指向其第一个元素的指针。所以最后一个表达式等价于表达式sizeof( char * )
。
如果你有,也要注意这一点
int x = 10;
size_t n = sizeof( ++x );
then x
在声明 11
之后将不等于 n
,因为在这种情况下,用作 sizeof
运算符的操作数的表达式不会被计算。重要的是表达式的类型。
另一方面,如果您有一个可变长度数组,那么运算符 sizeof
将在运行时进行评估以确定其大小。这是一个演示程序。
#include <stdio.h>
int main(void)
{
for ( int i = 1; i < 5; i++ )
{
int a[i];
printf( "sizeof( a[%d] ) = %zu\n",i,sizeof( a ) );
}
return 0;
}
程序输出为
sizeof( a[1] ) = 4
sizeof( a[2] ) = 8
sizeof( a[3] ) = 12
sizeof( a[4] ) = 16