C言語でコードを記述しました。このコードでは、乱数/文字で配列を初期化しています。しかし、配列の値を初期化した後に出力すると、すべてのインデックスの値が最後に割り当てられた値(最後のインデックスの値)と等しいことがわかります。親切にも、私のコードの問題は何ですか?配列の値が初期化後に同じでない
コード:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
char *save[3][3] = { {" "," "," "}, {" "," "," "}, {" "," "," "} };
char x[2] = {'\0', '\0'};
int i, j, b;
srand(time(NULL));
printf("Assigned Values (initializing):\n");
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
b = rand()%10;
x[0] = b+'0';
save[i][j] = x;
printf("%s ",save[i][j]);
}
}
printf("\n\nValues after initializing:\n");
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
printf("%s ",save[i][j]);
}
}
printf("\n\n");
return 0;
}
出力:
Assigned Values (initializing):
1 5 9 8 5 7 5 4 1
Values after initializing:
1 1 1 1 1 1 1 1 1
Press any key to continue . . .
[I] [J] = xを保存書き込まないでください。配列のすべての要素に同じポインタを割り当てます。 strcpy()を使用して値をコピーします。 –
@GiacomoDegliEspostiであり、 'save'のすべてのポインタが静的記憶域を指しているため、未定義の動作を呼び出すよりも優先されます。 – StoryTeller
@GiacomoDegliEsposti 'strcpy()'を使うと、文字列リテラルを変更すると*未定義の動作*が呼び出されるので、ここではうまくいかないようです。 – MikeCAT