2016-07-25 28 views
-1

Ich habe ein Stück Code in C geschrieben, in dem ich ein Array mit Zufallszahlen/Zeichen initialisiere. Aber wenn ich die Array-Werte nach der Initialisierung drucke, sehe ich, dass der Wert für jeden Index dem letzten zugewiesenen Wert entspricht (Wert des letzten Index). Bitte sagen Sie mir, was das Problem in meinem Code ist?Array-Werte nicht gleich nach der Initialisierung

Code:

#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; 
} 

Ausgang:

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

Schreiben Sie nicht speichern [i] [j] = x. Es weist allen Elementen des Arrays denselben Zeiger zu. Verwenden Sie strcpy(), um Werte zu kopieren. –

+0

@ GiacomoDegliEsposti, und dann undefiniertes Verhalten aufrufen, da alle Zeiger in 'save' auf statischen Speicher verweisen. – StoryTeller

+0

@GiacomoDegliEsposti Die Verwendung von 'strcpy()' scheint hier keine gute Wahl zu sein, da das Ändern von String-Literalen * undefiniertes Verhalten * aufruft. – MikeCAT

Antwort

5

Sie alle Elemente der Elemente des Arrays save auf den gleichen Zeiger initialisiert, so was Sie können jede von ihnen sehen mit wird gleich sein.

In diesem Fall empfehle ich Ihnen, die Daten direkt in save wie folgt speichern soll:

#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

Das hat funktioniert! Aber ich habe nicht verstanden, was du getan hast. Sie haben ein 3D-Array verwendet, was bedeutet, dass es "3x3x2 = 18" -Elemente gibt, aber in Ergebnis 9 werden Werte gedruckt. Bitte erläutern Sie, wie das funktioniert. – Agha

+0

@Agha Es gibt '3x3 = 9' Elemente vom Typ' char [2] 'und diese werden gedruckt. Obwohl dies hier nicht der Fall ist, beachten Sie bitte, dass das Vorhandensein von * n * -Elementen nicht immer bedeutet, dass * n * -Werte gedruckt werden. Beispielsweise können Sie nur die ersten 10 Elemente eines Arrays mit 1000 Elementen drucken. – MikeCAT

Verwandte Themen