sizeof()运算符的行为

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sizeof()运算符的行为相关的知识,希望对你有一定的参考价值。

对于以下代码:

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

输出是:

6 4

有人能告诉我为什么sizeof()提供不同的输出?

编辑:我本来打算打字输入sizeof(),但输入的是strlen()。我为此道歉。我现在已经编辑了这个声明。

答案

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

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

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

另一答案

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

另一答案

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

另一答案

声明如下的字符数组:

char a[] = "Apple";

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

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

另一答案

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

在这个声明中

char a[] = "Apple";

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

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

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

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

strlen(一)

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

考虑到你可以写一些例子

char a[100] = "Apple";

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

另一答案

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

另一答案

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

qazxsw poi是qazxsw poi的一系列指针。指针大小为4个字节。 s返回第一个元素的大小,即指针,即大小为4。

另一答案

当你定义:

char a [] =“Apple”;

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

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

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

不过,当你定义:

char * s [] = {“Apple”};

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

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

C 中 Sizeof 的行为

memcpy 中的指针运算有奇怪的结果[重复]

类型的 sizeof() 运算符

sizeof 运算符在 C# 中给出结构的额外大小 [重复]

在 sizeof(++n) 表达式中未调用增量运算符 [重复]

C++ 代码片段(积累)