sizeof()运算符的行为

问题描述 投票:0回答:8

对于以下代码:

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

输出是:

6 4

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

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

c++ c string char sizeof
8个回答
5
投票

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

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

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


5
投票

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


3
投票

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


3
投票

声明如下的字符数组:

char a[] = "Apple";

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

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


2
投票

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

在这个声明中

char a[] = "Apple";

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

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

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

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

strlen(一)

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

考虑到你可以写一些例子

char a[100] = "Apple";

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


1
投票

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


1
投票

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

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


1
投票

当你定义:

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是预期值。

© www.soinside.com 2019 - 2024. All rights reserved.