你忘了,你需要一個空字節終止字符串。 (事實上,你最後strcpy()
寫入陣列的界限之外,調用未定義的行爲)使用:
char picture[5][6] = { "#####", "#####", "#####", "#####", "#####", };
這節省了strcpy()
呼叫過於。
我說:
編譯器,如果你改變了6比5,但我認爲這是必需的,以允許初始化(即使它不得不放棄終止很可能會產生警告空字節)。但這是一個警告,你想要修復;它顯示出一個真正的問題。
事實上,GCC 4.8.2甚至沒有在相當嚴格的編譯選項下發出警告。
彙編:
gcc -O3 -g -std=c11 -Wall -Wextra -Werror ols.c -o ols
代碼:
#include <stdio.h>
static char picture1[5][5] = { "#####", "#####", "#####", "#####", "#####", };
static char picture2[5][6] = { "#####", "#####", "#####", "#####", "#####", };
int main(void)
{
for (int i = 0; i < 5; i++)
printf("%s\n", picture1[i]);
for (int i = 0; i < 5; i++)
printf("%s\n", picture2[i]);
return 0;
}
輸出:
#########################
####################
###############
##########
#####
#####
#####
#####
#####
#####
謝謝。我以爲我嘗試了你之前給過的語法,但它不起作用(儘管它可能也是一個空字節問題)。 – Zimm3r
如果將6更改爲5,編譯器可能會生成警告,但我認爲需要允許初始化器(即使它將刪除終止的空字節)。但這是一個警告,你想要修復;它顯示出一個真正的問題。 –
雅我後來修復它,但我真的沒有使用它們,因爲它在一個永遠不會結束的for循環中。謝謝 – Zimm3r