C中的sizeof()函数

时间:2013-07-17 16:09:43

标签: c arrays pointers

main()
{
char a[] = "Visual C++";
char *b = "Visual C++";
printf("\n %d %d",sizeof(a),sizeof(b));
printf("\n %d %d",sizeof(*a),sizeof(*b));
}

sizeof(a)为我提供输出:11(即字符串的长度)

为什么会这样?
为什么输出不是sizeof(a) = 4,因为当我尝试打印a时,它会给我一个地址值,从而得到一个整数?

4 个答案:

答案 0 :(得分:10)

每当你在程序中引用数组的名称时,它通常会衰减到指向数组第一个元素的指针。此规则的一个例外是sizeof运算符。所以当你考虑以下代码时。

int main()
{
   char a[] = "Visual C++";
   printf("sizeof(a)=%d\n",sizeof(a)); /* Here sizeof(a) indicates sizeof array */
   printf("a=%p",a); /* Here the array name, passed as an argument to printf decays into a pointer of type (char *) */
   return 0;
}

答案 1 :(得分:3)

在声明char a[] = "Visual C++"中,a是一个11 char的数组。所以它的大小是11个字节。

在声明char *b = "Visual C++"中,b是指向char的指针。所以它的大小是四个字节(在你正在使用的C实现中)。

在表达式printf("%s", a)中,a也是一个数组。但是,它会自动转换为指向数组第一个元素的指针。因此,指向char的指针将传递给printf

除非数组是&sizeof_Alignof的参数,否则此转换会自动发生,或者是用于初始化char数组的字符串文字。因为它是自动发生的,所以人们倾向于将数组名称视为指针。但是,他们不是。

顺便说一下,sizeof是一个操作符,而不是一个函数。

答案 2 :(得分:1)

当sizeof应用于静态数组的名称(不是通过malloc分配的数组)时,结果是整个数组的大小(以字节为单位)。这是规则的少数例外之一,即数组的名称被转换为指向数组的第一个元素的指针,并且可能仅仅因为实际的数组大小是固定的并且在编译时是已知的,当sizeof运算符是评估。

答案 3 :(得分:-1)

这里有很多错误。

“sizeof(a)给出输出:11(字符串的长度)”

字符串的长度为10,而不是11. sizeof(a)为您提供数组的长度。

“为什么会这样,为什么输出sizeof(a)= 4,因为当我尝试打印它时,它给我一个地址值”

以下两种“打印”的方法不会“给你一个地址值”:

puts(a);

printf("%s\n", a);

所以你的逻辑是有缺陷的,这是你混乱的根源。当您明确或隐含地选择这样做时,“仅打印”会给您一个地址值。

在这种情况下,

sizeof(a)给出11,因为C语言定义了sizeof运算符,以便在数组为操作数时为您提供数组的大小。我认为,这是人们所期望的最自然的行为,所以可能这就是它被定义为这样的原因。

“因此是整数。”

在任何情况下,地址都是地址,而不是整数。充其量你可以说它应该给你指针的大小,但肯定不是整数的大小。