#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。
答案 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 *
。