繁体   English   中英

sizeof()运算符的行为

[英]Behaviour of sizeof() operator

对于以下代码:

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

输出为:

6 4

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

编辑:我原本打算键入sizeof() ,但改为键入strlen() 我对此表示歉意。 我已经编辑了该声明。

sizeof给你的数字char小号分配到a ,而strlen为您提供了可用的字符串的长度在a

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

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

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

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

声明如下的字符数组:

char a[] = "Apple";

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

另一方面, strlen()返回空终止符之前的字符数。 是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函数,以区分字符数组的大小和字符数组中实际数据的数量。

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

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

s是一个指向char的指针数组。 指针大小为4个字节。 sizeof(s[0])返回第一个元素的大小,即指针,即其大小为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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM