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
为您提供分配给a
的char
s 的数量,而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】:a
是char
s 的数组,其中包含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() 运算符的行为的主要内容,如果未能解决你的问题,请参考以下文章