【问题标题】:In character Array Compiler giving extra space to store Null character but in string it's showing error在字符数组编译器中提供额外的空间来存储空字符但在字符串中它显示错误
【发布时间】:2025-12-14 20:25:02
【问题描述】:

char ch[5] = {'a', 'b', 'c', 'd', 'e'};这没有显示任何错误但是 char ch[5] = "abcde" 显示错误。为什么?

#include <iostream>
using namespace std;
int main() {
    char ch[5] = {'a', 'b', 'c', 'd', 'e'};
    int i;
    for( i = 0; ch[i] != '\0'; i++){
        cout << ch[i] << ' ';
    }
return 0;
}

输出:- a b c d e 在这种情况下,while 循环终止意味着存在空字符,但由于我给出了 5 的大小,所以它在哪里存储了这个空字符?

但是当我写这个程序时:-

#include <iostream>
using namespace std;
int main() {
    char ch[5] = "abcde";
    int i;
    for( i = 0; ch[i] != '\0'; i++){
        cout << ch[i] << endl;
    }
return 0;
}

在这种情况下,它会显示错误:- 字符数组的初始化字符串太长 [-fpermissive] 请解释为什么会这样。

【问题讨论】:

    标签: c++ string


    【解决方案1】:

    循环终止意味着存在空字符,但由于我给出了 5 的大小,所以它在哪里存储了这个空字符?

    这个数组中没有空字符,当你使用双引号时你只会得到一个(就像在你的第二个 sn-p 中一样)。

    你越界访问了数组,很幸运(内存中的下一个字节恰好为空,这次没有调用nasal demons)。

    但是 char ch[5] = "abcde" 显示错误。为什么?

    因为空字符没有空间。


    仅供参考,与 C++ 相比,C 在这方面没有那么严格,并且允许 char ch[5] = "abcde";。在这种情况下不添加空字符。

    【讨论】:

    • 我试过 char ch[5] = {'a', 'b', 'c', 'd', 'e'};诠释我; for( i = 0; ch[i] != '\0'; i++){ cout
    • @Deeksha 越界访问数组是未定义的行为,句号。如果你知道汇编,你可以看看你的编译器生成的汇编,看看为什么它总是有效,但最终它仍然是 UB。
    【解决方案2】:
    char ch[6] = "abcde";
    

    试试这个。它需要一个额外的索引来存储'\0'

    【讨论】: