字符数组的初始化字符串过长,C语言报错。

5

我正在开发一个程序,它接受输入并输出与输入相对应的数值。我在 char 部分遇到了错误。我不明白为什么只有 27 个字符的数组会出现错误,而且该数组的大小也是 27?

int main ()
{
    char greek[27] = "ABGDE#ZYHIKLMNXOPQRSTUFC$W3";
}

5
使用char greek[] = "ABGDE#ZYHIKLMNXOPQRSTUFC$W3"; - Jayesh Bhoi
相关链接: https://dev59.com/LkrSa4cB1Zd3GeqPUTR0 - alk
1个回答

10
你需要再加一个[28]才能使结尾的'\0'成为一个有效的字符串。
请查看C编程笔记:第8章:字符串
引用:

C中的字符串由字符数组表示。字符串的结尾标有一个特殊的字符,空字符,它仅是具有值0的字符。 (空字符除了名字与空指针外没有任何关系。在ASCII字符集中,空字符命名为NUL)。另一个字符转义序列,\0代表空字符串。

并且正如Jim Balter和Jayesh所指出的,在提供初始值时,可以省略数组大小(编译器使用初始化程序的数量作为数组大小)。
char greek[] = "ABGDE#ZYHIKLMNXOPQRSTUFC$W3";

3
使用char greek[]比使用char greek[28]更好。 - Jim Balter
@JimBalter 我可以问一下为什么吗? - LandonZeKepitelOfGreytBritn
@JimBalter 我希望你能更详细地解释编译器如何处理方括号之间的“空格”。我知道有时候不需要提及数组的长度,但是除非你动态分配内存,据我所知,编译器总是需要预先知道数组的长度以便在堆栈上保留必要的空间。因此,我希望你能再次解释一下“[<nothing>]”是如何工作的。也就是说,它在幕后是如何运作的。为什么这不是显而易见的呢? - LandonZeKepitelOfGreytBritn
3
你正在回答自己:“编译器总是需要提前知道数组的长度,以便在堆栈上预留必要的空间”,但手动计数容易出错;例如char name[6] = "Ramón";由于“ó”占用2个字节,因此不会留下空间给结尾的NUL字符,所以让编译器为你计数。 - David Ranieri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接