sizeof char 数组差一
sizeof char array is off by one
我想使用 sizeof 函数来获取 char 数组的大小。我得到的尺寸太多了。示例:
#include <stdio.h>
char text[] = "hey";
const int n = sizeof(text);
int main(int argc, char *argv[])
{
printf("%i\n", n);
return 0;
}
输出 4,而不是预期的 3。我在各种在线 c++ 编译器上重现了这种行为,所以我认为这是有意为之的(奇怪的是,我在互联网上找不到任何相关信息)。我可以在网上找到的大多数资料都说它应该是 3 * sizeof(char) (在大多数普通系统上是 3)。
如果我理解正确的话,还有一个额外的字节以某种方式用于数组表示。为什么会这样?
字符串字面值隐式 NUL
终止,所以 "hey"
实际上是四个字符的大小;您看到的三个字母,加上 [=12=]
(又名 NUL
)。
当你初始化一个数组而不指定大小时,它会调整它的大小以匹配初始化器,而初始化器是包括 NUL
在内的四个字节数量。 char text[] = "hey";
相当于说 char text[] = {'h', 'e', 'y', '[=16=]'};
。如果它不是这样工作的,尝试将数组的内容作为 C 风格的字符串来处理会 运行 通过缓冲区进入邻近的内存,直到它巧合地找到一个 NUL
终止符。
我想使用 sizeof 函数来获取 char 数组的大小。我得到的尺寸太多了。示例:
#include <stdio.h>
char text[] = "hey";
const int n = sizeof(text);
int main(int argc, char *argv[])
{
printf("%i\n", n);
return 0;
}
输出 4,而不是预期的 3。我在各种在线 c++ 编译器上重现了这种行为,所以我认为这是有意为之的(奇怪的是,我在互联网上找不到任何相关信息)。我可以在网上找到的大多数资料都说它应该是 3 * sizeof(char) (在大多数普通系统上是 3)。
如果我理解正确的话,还有一个额外的字节以某种方式用于数组表示。为什么会这样?
字符串字面值隐式 NUL
终止,所以 "hey"
实际上是四个字符的大小;您看到的三个字母,加上 [=12=]
(又名 NUL
)。
当你初始化一个数组而不指定大小时,它会调整它的大小以匹配初始化器,而初始化器是包括 NUL
在内的四个字节数量。 char text[] = "hey";
相当于说 char text[] = {'h', 'e', 'y', '[=16=]'};
。如果它不是这样工作的,尝试将数组的内容作为 C 风格的字符串来处理会 运行 通过缓冲区进入邻近的内存,直到它巧合地找到一个 NUL
终止符。