1
#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。

4

3 回答 3

4

当您将数组传递给像您这样的函数时,它将衰减为指针,因此sizeof将返回指针的大小而不是数组的大小。C 常见问题解答中关于数组和指针的部分是一个很好的参考,问题 6.4涵盖了这个确切的问题。C99 标准草案的相关部分是6.3.2.1 Lvalues,arrays,and function designators部分第3段,它说(强调我的):

除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为 ''array of type'' 的表达式将转换为类型为 ''pointer to type'' 指向数组对象的初始元素并且不是左值。

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

于 2013-09-26T17:05:51.147 回答
3

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

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

于 2013-09-26T17:07:01.783 回答
0

C 没有传递数组值的特性。数组总是作为指针传递,当你声明一个类型的参数时,foo[]你实际上是在声明foo *.

于 2013-09-26T17:07:10.300 回答