sizeof()运算符的行为

时间:2014-07-17 13:53:37

标签: c++ c string char sizeof

对于以下代码:

char a[] = "Apple";
char *s[] = {"Apple"};
printf("%d %d\n", sizeof(a), sizeof(s[0]));

输出结果为:

6 4

有人可以告诉我为什么sizeof()会提供不同的输出吗?

编辑:我打算最初输入sizeof(),但输入strlen()。我为此道歉。我现在已经编辑了这个陈述。

8 个答案:

答案 0 :(得分:5)

sizeof为您提供分配到char的{​​{1}}个数,而a为您提供strlen中可用字符串的长度。

答案 1 :(得分:5)

sizeof(a)是数组的大小,包含终结符以及5个可打印字符。

strlen(s[0])给出字符串的长度,不包括终止符,因为这是strlen指定要执行的操作。

更新:sizeof(s[0])是指针的大小。只给出指向它的指针,无法确定数组的大小。

答案 2 :(得分:3)

\0计算字符串内存大小的一部分,但strlen()给出的字符串本身的长度仅由\0之前的字符给出遇到了。

答案 3 :(得分:3)

声明如下的字符数组:

char a[] = "Apple";
根据语言规范,

具有空终止符。因此,数组的长度为6.有5个字符,然后是空终止符。

另一方面,strlen()返回空终止符之前的字符数。这是5。

答案 4 :(得分:2)

sizeof运算符产生其操作数的大小(以字节为单位)。

在本声明中

char a[] = "Apple";

数组a由包含终止零的字符串文字“Apple”的字符初始化。 实际上这个记录相当于

char a[] = { 'A', 'p', 'p', 'l', 'e', '\0'; };

所以a的字节大小等于6。

标准C函数strlen计算字符串中的符号,直到遇到终止零。所以

strlen(a)

将返回5,即数组中终止零之前的字符数。

考虑到您可以编写例如

char a[100] = "Apple";

在这种情况下,sizeof( a )将产生100,因为您明确指定了数组占用的字节数。但是它只用字符串文字的6个字符初始化。那么如何找到字符数组中有多少实际数据呢?为此,引入了函数strlen,以区分字符数组的大小和字符数组中实际数据的数量。

答案 5 :(得分:1)

因为在C中没有字符串类型。 String是一个以NULL结尾的字符数组。 strlen()计算字符直到NULL字符,而sizeof()实际上返回charater数组使用的内存量。

答案 6 :(得分:1)

a是一个char的数组,其中包含6个元素,因此sizeof返回6(字符串的长度包括零终止)。

s是指向char的指针数组。指针大小为4个字节。 sizeof(s[0])返回第一个元素的大小,即指针,即大小为4。

答案 7 :(得分:1)

定义时:

  

char a [] =" Apple&#34 ;;

它表示一个字符数组,它等于以下定义:

  

char a [] = {' A',' p',' p',' l',' e& #39;,' \ 0'}; //' \ 0'是字符串终止字符,等于0

由于char类型大小为1,sizeof(a)返回6,这是整个数组的大小。

然而,当你定义:

  

char * s [] = {" Apple"};

它表示 char指针的数组。因此sizeof(s [0])返回其第一个元素的大小 等于sizeof(char *)。 对于32位平台,sizeof(char *)= 4.如果在64位平台上执行,则8是预期值。