2016-07-25 7 views
-1

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 . . . 
+1

[I] [J] = xを保存書き込まないでください。配列のすべての要素に同じポインタを割り当てます。 strcpy()を使用して値をコピーします。 –

+0

@GiacomoDegliEspostiであり、 'save'のすべてのポインタが静的記憶域を指しているため、未定義の動作を呼び出すよりも優先されます。 – StoryTeller

+0

@GiacomoDegliEsposti 'strcpy()'を使うと、文字列リテラルを変更すると*未定義の動作*が呼び出されるので、ここではうまくいかないようです。 – MikeCAT

答えて

5

あなたは同じポインタに配列saveの要素のすべての要素を初期化するので、あなたがそれらのいずれかを使用して見ることができます同じになります。この場合

、私はあなたがこのようなsaveに直接データを保存する必要がありますお勧め:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 


int main (void) { 

    char save[3][3][2] = { {" "," "," "}, {" "," "," "}, {" "," "," "} }; 
    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; 
      save[i][j][0] = b+'0'; 
      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; 
} 
+0

これは機能しました!しかし、私はあなたがしたことを理解していませんでした。あなたは '3x3x2 = 18 '要素があることを意味する3D配列を使用しましたが、結果9の値が出力されるので、どのように動作するのか説明してください。 – Agha

+0

@Agha 'char [2]'型の '3x3 = 9'要素があり、それらが出力されます。これはここでは当てはまりませんが、* n *個の要素を持つことは必ずしも* n *値が出力されるわけではありません。たとえば、1000要素配列の最初の10要素だけを印刷できます。 – MikeCAT