关于字符串的一些问题
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。
我遇到了问题。在下面的代码中,我期望字符串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。