Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符数组的大小和字符指针的大小_C_Char_Sizeof - Fatal编程技术网

C 字符数组的大小和字符指针的大小

C 字符数组的大小和字符指针的大小,c,char,sizeof,C,Char,Sizeof,我有一段C代码,我不明白sizeof(…)函数是如何工作的: #include <stdio.h> int main(){ const char firstname[] = "bobby"; const char* lastname = "eraserhead"; printf("%lu\n", sizeof(firstname) + sizeof(lastname)); return 0; } #包括 int main(){ const char fi

我有一段C代码,我不明白
sizeof(…)
函数是如何工作的:

#include <stdio.h>

int main(){
   const char  firstname[] = "bobby";
   const char* lastname = "eraserhead";
   printf("%lu\n", sizeof(firstname) + sizeof(lastname));
   return 0;
}
#包括
int main(){
const char firstname[]=“bobby”;
const char*lastname=“橡皮擦头”;
printf(“%lu\n”,sizeof(firstname)+sizeof(lastname));
返回0;
}
在上面的代码中,sizeof(firstname)是6,sizeof(lastname)是8

但是
bobby
有5个字符宽,
eraserhead
有11个字符宽。我希望
16

为什么字符数组和指向字符的指针的sizeof行为不同


有人能澄清吗?

firstname
是一个
char
数组,带有尾随的
0
-终止符
lastname
是一个指针。在64位系统上,指针的宽度为8字节。

firstname
是一个
char
数组,带有尾随的
0
-终止符
lastname
是一个指针。在64位系统上,指针的宽度为8字节。

第一个数组的大小是bobby\0的大小<代码>\0是终止符字符,因此它是6


第二个大小是指针的大小,在64位系统中为8字节。它的大小不取决于指定字符串的长度。

第一个数组的大小是bobby\0的大小<代码>\0是终止符字符,因此它是6


第二个大小是指针的大小,在64位系统中为8字节。它的大小不取决于指定字符串的长度。

sizeof
数组是整个数组的大小,对于“bobby”,它是5个字符和一个尾随的
\0
,等于6


sizeof
指针是指针的大小,在32位机器中通常为4字节,在64位机器中为8字节。
sizeof
数组是整个数组的大小,在“bobby”的情况下,它是5个字符,一个尾随的
\0
等于6


sizeof
指针是指针的大小,在32位机器中通常为4字节,在64位机器中为8字节。

firstname[]
以null结尾,长度增加1


sizeof(lastname)
给出的是指针的大小而不是实际值。

firstname[]
以null结尾,长度增加1


sizeof(lastname)
给出的是指针的大小而不是实际值。

firstname
是一个由6个
字符组成的数组,包括字符串结尾的
'\0'
字符。这就是为什么名字的大小是6


lastname
是指向
char
的指针,它在系统上的大小与指针的大小无关。典型值为4和8。
lastname
的大小将是相同的,无论它指向什么(或者即使它根本没有指向任何东西)。

firstname
是一个由6个
字符组成的数组,包括字符串末尾的终止
'\0'
字符。这就是为什么名字的大小是6

lastname
是指向
char
的指针,它在系统上的大小与指针的大小无关。典型值为4和8。
lastname
的大小将是相同的,无论它指向什么(或者即使它根本没有指向任何东西)

sizeof(…)函数的工作原理

sizeof()
看起来像一个函数,但它不是一个函数。函数在运行时计算某些内容

sizeof()
在编译时询问编译器为参数分配了多少内存。顺便说一句,
sizeof()
不知道以后在运行时实际使用了多少。换句话说,您已经“硬编码”了示例中的
printf
参数

为什么字符数组和指针的sizeof行为不同 要扮演什么角色

指针很少需要与数组相同的内存量

通常,为指针分配的内存量与为指针对象分配的内存量不同

sizeof(…)函数的工作原理

sizeof()
看起来像一个函数,但它不是一个函数。函数在运行时计算某些内容

sizeof()
在编译时询问编译器为参数分配了多少内存。顺便说一句,
sizeof()
不知道以后在运行时实际使用了多少。换句话说,您已经“硬编码”了示例中的
printf
参数

为什么字符数组和指针的sizeof行为不同 要扮演什么角色

指针很少需要与数组相同的内存量


一般来说,为指针分配的内存量与为指针对象分配的内存量不同。

*lastname
是单个
char
,因此
sizeof*lastname
始终为1。
*lastname
是单个
char
,因此,
sizeof*lastname
将始终为1。很明显,OP试图找出字符串的大小,即字符串长度,并在他说
“为什么不5+10=15?”
时将两者相加。
,通过
sizeof
strlen()
获得字符串长度真的可能吗?@PHIfounder:由于C语言中的“字符串”是由以
'\0'
字符结尾的一系列字符表示的,因此使用
strlen()
可以获得“字符串”的长度。这适用于“真实”字符数组,也适用于指向后者的指针。在这种情况下,如何以及在何处存储字符并不重要。事实上,保存字符串的变量不一定需要匹配“字符串”的长度。另一方面,如果它对声明使用的变量字节数感兴趣,则使用