sizeof() 运算符的行为

Posted

技术标签:

【中文标题】sizeof() 运算符的行为【英文标题】:Behaviour of sizeof() operator 【发布时间】:2014-07-17 13:53:37 【问题描述】:

以下代码:

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

输出是:

6 4

谁能告诉我为什么sizeof() 给出不同的输出?

编辑:我原本打算输入sizeof(),但改为输入strlen()。我为此道歉。我现在已经编辑了声明。

【问题讨论】:

Err... 可能是因为您使用 strlen 代替 s[0](不包括 0 终止符)...(不过,sizeof s[0] 会给出 sizeof(char *) 因为第二个测试的不是sizeof,而是strlen? strlen 不包括终止空字符。然而,即使它是 sizeof,它也会返回指向字符串的指针的大小。 @mafso 哎呀!我的错。我已经编辑了问题陈述。我确实打算只写 sizeof()。 参见例如here 可能还有 here。而char *s[] = "Apple";(除了附加标识符)等同于char *tmp = "Apple"; char *s[] = tmp ;,而不是(你似乎假设的)char s[][6] = "Apple" ;(参见我最后评论的第二部分)。相关:c-faq.com/aryptr/index.html。最后同样重要的是:使用%zu 打印size_t 变量,%d 用于int(并且sizeof 产生一个size_t 类型的对象)。 -1 用于更改问题!!!! 【参考方案1】:

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

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

更新:sizeof(s[0]) 是指针的大小。仅给定一个指向数组的指针,就无法确定数组的大小。

【讨论】:

【参考方案2】:

sizeof 为您提供分配给achars 的数量,而strlen 为您提供a 中可用字符串的长度。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

这样声明的字符数组:

char a[] = "Apple";

根据语言规范,有一个空终止符。因此,数组的长度为6。有5个字符,然后是空终止符。

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

【讨论】:

【参考方案5】:

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,用于区分字符数组的大小和字符数组中实际数据的数量。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

当你定义时:

char a[] = "苹果";

表示一个字符数组,相当于如下定义:

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

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

但是,当您定义时:

char *s[] = "苹果";

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

【讨论】:

以上是关于sizeof() 运算符的行为的主要内容,如果未能解决你的问题,请参考以下文章

C语言中,sizeof运算符有啥作用?

sizeof运算符malloc函数及free函数

为啥 sizeof 被认为是运算符?

对象表示和运算符 sizeof 的定义

sizeof运算符

指针数组与sizeof运算符