关于字符串的一些问题

Some questions about strings

我遇到了问题。在下面的代码中,我期望字符串p的长度为3,但实际长度为6。这是我首先疑惑的地方。然后自己调试的时候,调试出来的p的长度是符合预期结果的。这让我感到很不解。不知道为什么p的长度是6,为什么调试的时候长度变成了3。 .有人可以回答这个问题吗?

#include <cstring>
#include <cstdio>

int main()
{
    char p[]={'a','b','c'}, q[10] = {'a','b','c'};
    printf("%p  %p\n",&q,&p);
    printf("%d  %d\n",strlen(q),strlen(p));
    return 0;
}

pic-1 pic-2

问题是,p 不是一个以 null 结尾的字符数组,所以它不能用作 字符串 。将其用作期望 string 的函数调用的参数将导致 undefined behaviour (UB).

无法以任何方式证明包含 UB 的程序的输出。

为了添加更多上下文,q 是空终止的,根据参数小于聚合大小的初始化列表的规则,其余成员被初始化,就好像它们具有静态存储一样,所以在 char 类型的情况下,它们使用 0 (这是字符串所需的空终止符)进行初始化。所以,使用 q 作为字符串是可以的。

解法:

您可以

  • 提到的维度比初始化列表的元素多
  • 将空值作为最后一个元素 n 初始化列表 {'a','b','c', '[=15=]'}
  • 使用字符串(而不是初始化列表)来初始化数组,如"abc",它将在数组中包含空终止符。

在 C 中,字符串必须以空字节结尾,这就是 strlen 找到它们长度的方式。像这样声明您的字符串,长度将正确显示:

char p[]={'a','b','c', '[=10=]'}, q[10] = {'a','b','c', '[=10=]'};

p 不是空终止; strlen 一直计数直到它看到一个空值(或者你的程序被中止,因为你访问了不属于你的内存)。

注意 q 初始化的,初始化器中未提供的任何数组元素都设置为 null。