C字符串无限循环为小C []

时间:2014-03-09 05:22:53

标签: c++

为什么使用for循环时c-string长度很重要?终止字符'\ 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;
}

通过在我的c-string中添加't',代码运行得很好:

    char c[] = "charact";
    int i;

    for (i=0; i < 8 ; i++)
    {
        cout << c[i] << endl;
    }

5 个答案:

答案 0 :(得分:2)

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

Array:   c h a r a c \0
Indices: 0 1 2 3 4 5 6

尝试访问除此之外的任何内容都是未定义的行为。

在你的第二个版本中,假设你运行的代码有t你忘了放入发布版本,那么数组有8个字符,循环保持在数组的范围内。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我认为你已经超越了角色阵列的末尾。通过添加额外字符,您的字符串现在长度为7个字符,因此i&lt; 8测试可以正常工作。

答案 3 :(得分:1)

您是数组末尾的索引。 C开始索引为零,因此六个字符串的最后一个索引是五。如果你包含null终止符,那么你有6个,但是你正在访问第七个数组位置。

答案 4 :(得分:0)

c [7]对于“charac”不存在,因为c [6]是空终止字符。但是当你把它改成“charact”时,c [7]就会变成空终止字符,所以运行正常。