我是编程新手,所以我正在练习 C。然后我的代码遇到了问题:
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = "Hello";
printf("Length of a: %lu\n", strlen(a));
char b[] = {'H', 'e', 'l', 'l', 'o'};
printf("Length of b: %lu\n", strlen(b));
}
我期待得到:
Length of a: 5
Length of b: 5
相反,我得到:
Length of a: 5
Length of b: 10
我尝试过不同的字符串,但每次 b 的长度都是 a 的两倍 为什么b的长度是a的两倍?
这是未定义的行为,因为
b
数组没有空间容纳空终止符。 strlen
函数正在搜索该值,因此它知道何时停止计数。
因此,发生的情况是它从数组末尾运行并继续运行,直到操作系统出现段错误或者您在内存中遇到一个不属于数组的零值字节。
关于您的具体问题:
为什么b的长度是a的两倍?
这根本无法保证。它发生在你身上纯属偶然。为了更好地理解,您需要查看为您的程序生成的程序集。这可能是编译器在内存中安排程序其他部分的结果,也可能只是您看到了不存在的模式。
C 字符串是由 *null 字符终止的 char 数组
char a[] = "Hello";
使用 字符串文字
char
初始化 a
数组 "Hello"
{'H', 'e', 'l', 'l', 'o', '\0'}
char b[] = {'H', 'e', 'l', 'l', 'o'};
初始化数组,该数组与初始化程序中列出的字符完全相同。它不包含终止空字符并且b
不包含有效的C字符串。当您将此数组传递给您调用的任何字符串函数时,未定义的行为