我是编程新手,所以我在练习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数组没有null终止符.strlen函数正在搜索它,以便它知道何时停止计数.

因此,它从数组的末端运行,并一直运行,直到OS segfault或您在内存中遇到值为零的字节,而不是数组的一部分.

为了更好地理解两个数组之间的差异,请在这里阅读更多信息:Array Initialization

关于你的具体问题:

为什么b的长度是a的两倍?

这根本就不能保证.它发生在你身上纯属偶然.为了更好地理解,您需要查看为您的程序生成的程序集.这可能是编译器如何在内存中安排程序的其他部分的结果,也可能只是你看到了一个不存在的模式.

C++相关问答推荐

如何将一个enum类型类型转换为另一个类型?

函数指针始终为零,但在解除引用和调用时有效

错误:C中需要参数声明符

Mbed TLS:OAEP的就地en—/decryption似乎不起作用'

如何解决C中的严格别名?

使用GOTO从多个嵌套循环C继续

Ruby C Api处理异常

试图从CSV文件中获取双精度值,但在C++中始终为空

如何使解释器存储变量

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

C语言中的外部关键字

C11/C17标准允许编译器清除复合文字内存吗?

通过k&;r语法的c声明无效

为什么会出现此错误?二进制表达式的操作数无效

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

我的代码可以与一个编译器一起使用,但不能与其他编译器一起使用

将char*铸造为空**

GnuCobol 使用 double 类型的参数调用 C 函数

为什么 C 字符串并不总是等同于字符数组?