关于字符串的一些问题

橘子

我遇到了一个问题。在下面的代码中,我预计字符串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;
}

图一 图二

苏拉夫·戈什

问题是,p不是以空字符结尾的字符数组,因此不能用作string使用它作为期望字符串的函数调用的参数,将导致未定义的行为 (UB)

包含 UB 的程序的输出不能以任何方式证明是合理的。

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

解决方案:

你可以

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章