2016-07-25 89 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'元素,但結果9值被打印,所以請解釋它是如何工作的? – Agha

+0

@Agha有'char [2]'類型的'3x3 = 9'元素,它們被打印。雖然這裏不是這種情況,但請注意,具有* n *個元素並不總是表示打印出* n *個值。例如,您只能打印1000個元素數組的前10個元素。 – MikeCAT