2013-09-26 91 views
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 
} 

为什么这个anamolous输出为什么sizeof()一个char数组有时sizeof(void *)有时sizeof(数组)?

请解释什么是“海峡”和“S” .... 以及如何我可以有之间的差异的sizeof()输出=在打印功能27。

+1

在介绍类中,我们经常被教导数组是指针,指针是数组。这不是真的。它们在许多方面类似,但不相同。 – abelenky

回答

4

当你将一个数组传递给像你这样的函数时,它会衰减到一个指针,因此sizeof将返回一个指针的大小而不是数组的大小。 C Faq's section on Arrays and Pointers是一个很好的参考和Question 6.4涵盖了这个确切的问题。 C99标准草案的有关部分是部分6.3.2.1左值,数组和功能指示器段落它说(重点煤矿):

除了当该值是sizeof操作者或一元的操作数&运算符,或者是 用于初始化数组的字符串,表达式的类型为'''的数组的类型为 转换为类型为''的表达式指向类型为''的表达式指向初始元素 数组对象并不是左值。

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

3

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

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

0

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