C中的字符串数组

0xF*_*xFF 11 c arrays string

我有一个字符串数组,当我迭代并打印其元素时,我会得到意想不到的结果.

char currencies[][3] = {"EUR", "GBP", "USD", "JPY", "CNY"};

void show_currencies()
{
    int i;
    for(i=0; i<5; i++)
    {
        printf("%s - ", currencies[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我打电话时,show_currencies()我得到了输出.

EURGBPUSDJPYCNY - GBPUSDJPYCNY - USDJPYCNY - JPYCNY - CNY -
Run Code Online (Sandbox Code Playgroud)

谁能解释这种行为.

谢谢

Cha*_*tie 14

您缺少nul终止符,字符串实际上是4个字符长.然后每个字符串都在写入前一个字符串的null终止符*.尝试改为:

char currencies[][4] = {"EUR", "GBP", "USD", "JPY", "CNY"}; 
Run Code Online (Sandbox Code Playgroud)

*正如caf所指出的那样,它不是"过度写入前一个字符串的空终止符",因为空终止符永远不会被复制到数组中.字符串在最终' - '之后没有乱码输出是一个侥幸.


Mat*_*hen 8

你宣布错了.这会奏效.它只是让编译器设置一个指向const-chars的指针数组:

const char *currencies[] = {"EUR", "GBP", "USD", "JPY", "CNY"};
Run Code Online (Sandbox Code Playgroud)

编辑:使它成为一个二维数组,就像Charles Beattie的答案一样,只要你为null分配空间,它也可以.另外,const根据Christoph 指定字符.