C++ C字符串无限循环用于小C[]

C++ C字符串无限循环用于小C[],c++,C++,为什么使用for循环时c字符串长度很重要?终止字符“\0”是否有问题 以下代码将for循环发送到一个疯狂的循环中,导致编译器崩溃: #include <iostream> #include<cstring> using namespace std; int main() { char c[] = "charac"; int i; for (i=0; i < 8 ; i++) { cout << c[i

为什么使用for循环时c字符串长度很重要?终止字符“\0”是否有问题

以下代码将for循环发送到一个疯狂的循环中,导致编译器崩溃:

#include <iostream>
#include<cstring>

using namespace std;

int main()
{
    char c[] = "charac";
    int i;

    for (i=0; i < 8 ; i++)
    {
        cout << c[i] << endl;
    }
    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
char c[]=“charac”;
int i;
对于(i=0;i<8;i++)
{

cout在第一个版本中,没有字符
c[7]
。数组中有7个字符,6个字符串字符和1个空终止符:

Array:   c h a r a c \0
Indices: 0 1 2 3 4 5 6
试图访问超出此范围的任何内容都是未定义的行为


在第二个版本中,假设您正在运行的代码具有您忘记放入发布版本中的
t
,则数组有8个字符,循环保持在数组的边界内。

在第一个版本中,没有字符
c[7]
。数组中有7个字符,6个字符串和1个空终止符:

Array:   c h a r a c \0
Indices: 0 1 2 3 4 5 6
试图访问超出此范围的任何内容都是未定义的行为



在第二个版本中,假设您正在运行的代码具有您忘记放入发布版本的
t
,则数组有8个字符,循环保持在数组的边界内。

您有一个长度为7的字符串(6+空终止符),正在尝试访问第8个元素。这将导致未定义的行为。

您有一个长度为7的字符串(6+空终止符),并试图访问第8个元素。这将导致未定义的行为。

我认为您正在跨过字符数组末尾。通过添加额外字符,您的字符串现在有7个字符长,因此I我认为您正在跨过字符数组末尾。通过添加extr一个字符,您的字符串现在有7个字符长,因此i您的索引超过了数组的末尾。C开始索引为零,因此六个字符字符串的最后一个索引为五。如果包含空终止符,则您有六个,但您正在访问第七个数组位置。

您的索引超过了数组的末尾。C开始索引如果包含空终止符,则有六个字符,但正在访问第七个数组位置。

c[7]对于“charac”不存在,因为c[6]是空终止符。但是,如果将其更改为“charact”,则c[7]成为空终止字符,因此运行正常。

c[7]不存在于“charac”中,因为c[6]是空终止字符。但当您将其更改为“charact”时,c[7]将成为空终止字符,因此运行正常。

但他只添加了“t”,因此没有c[7]修改后调用?@linpingta:t将数组的长度增加到8。我想我只是想知道“未定义行为”是什么。显然,这是一个混乱的编译。但它似乎只与超出长度有关,而与实际内容(即空字符)无关。这只是我第一次练习c字串,我在尝试不同的输入和输出行为。实际上,我正在尝试动态地调整for循环以匹配不同大小的字符串,所以这是一点练习。@Mikael_SFSU:未定义的行为几乎可以是任何东西。标准的夸张是t计算机是允许的。但是他只添加了“t”,所以在修改后没有调用c[7]。@linpingta:t将数组的长度增加到8。我想我只是想知道“未定义的行为”是什么。显然,这是一个杂乱无章的编译。但它似乎只与超出长度有关,而与实际内容无关(即空字符)。这只是我第一次练习c字串,我在尝试不同的输入和输出行为。实际上,我正在尝试动态地调整for循环以匹配不同大小的字符串,所以这是一点练习。@Mikael_SFSU:未定义的行为几乎可以是任何东西。标准的夸张是t计算机被允许。你是否添加了“t”?是的,谢谢你抓住了这个问题。我刚刚编辑了这个问题。请注意,崩溃的不是编译器,而是由你的(错误)代码生成的程序崩溃的源代码。你是否添加了“t”?是的,谢谢你捕捉到这一点。我刚刚编辑了这个问题。请注意,崩溃的不是编译器,而是源代码(错误)生成的程序。这会发生在任何类型的数组中吗?还是仅仅是c字符串?我想第一个问题的答案是否,因为其他数组默认初始化为0,但c字符串在\0之后没有任何内容"。访问任何超出边界的数组都是未定义的行为。在这种情况下,默认情况下,您将数组初始化为编译器确定的大小7。当您将数组初始化为大小8时,您的循环不再超出边界。任何数组都会发生这种情况。您的循环条件应仅循环所访问数组的有效元素评级。这会发生在任何类型的数组中吗?还是只是c字符串?我认为第一个问题的答案是“否,因为其他数组默认初始化为0,但c字符串在\0之后没有任何内容”。访问任何超出边界的数组都是未定义的行为。在这种情况下,默认情况下,您将数组初始化为编译器确定的大小7。当您将数组初始化为大小8时,您的循环不再超出边界。任何数组都会发生这种情况。您的循环条件应仅循环所访问数组的有效元素评级