为什么sizeof()一个char数组有时是sizeof(void *),有时是sizeof(数组)?

时间:2013-09-26 17:02:30

标签: c sizeof

#include<stdio.h>

void printS(char []);

int main(){
    char str[]="The C Programming Language"; 
    printf("%d \n",sizeof(str)); //output=27
    printS(str);
}

void printS(char s[]){
    printf("%d \n",sizeof(s)); //output=4
}

为什么这个无意义的输出

请解释'str'和's'之间有什么区别.... 以及如何在printS函数中使用sizeof()output = 27。

3 个答案:

答案 0 :(得分:4)

当你将一个数组传递给类似于它的函数时,它会衰减为指针,因此sizeof将返回不是数组大小的指针大小。 C Faq's section on Arrays and Pointers是一个很好的参考,Question 6.4涵盖了这个问题。 C99标准草案的相关部分是6.3.2.1 Lvalues,数组和函数指示符 3 ,其中(强调我的):

  

除非它是sizeof运算符或一元&amp;的操作数。运营商,或者是   用于初始化数组的字符串文字,类型为''数组类型'的表达式是   转换为类型为''指向类型'的指针的表达式,指向的初始元素   数组对象并且不是左值。

为了获得C样式字符串的长度,您可以使用strlen头文件中的string.h

答案 1 :(得分:3)

sizeof()的值是指定类型的一个变量的大小。 s实际上是char*,因此sizeof(s)是4(在您的32位平台上)。在main()中,str被视为char数组,因此sizeof(str)是数组的大小。请注意,“C编程语言”的长度为26,额外的一个字节用于零终止符。

要获得s的长度,请使用strlen(s)。这次零终结器不计算在内。并且不要忘记在开始时#include <string.h>

答案 2 :(得分:0)

C没有传递数组值的功能。数组总是作为指针传递,当您声明类型foo[]的参数时,您实际上声明了foo *

相关问题