2016-11-04 3 views
0

Ich habe ein Problem der Ausführung, wenn ich trey, um dieses Programm auszuführen, ist es einfach ein mehrdimensionales Array mit ausgewählten Werten dynamisch zuzuweisen und es einfach Null. Es kompiliert korrekt, aber es wird nicht ausgeführt.Mehrdimensionale Arrays dynamisch zuweisen

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

    int main(void) { 
     int **tab; 
     int ligne; 
     int col; 
     printf("saisir le nbre de lignes volous\n"); 
     scanf("%d", &ligne); 
     printf("saisir le nbre de colonnes volous\n"); 
     scanf("%d", &col); 
     tab = (int**)malloc(ligne*sizeof(int*)); 
     int i ,j; 
     for (i=0 ; i < ligne; i++) { 
      *(tab+i) = (int*)malloc(col*sizeof(int)); 
     } 
     for (i = 0; i < ligne; i++) { 
      for (j = 0; j < col; j++) { 
       **(tab + i+ j) = 0; 
      } 
     } 
     for (i = 0; i < ligne; i++) { 
      for (j = 0; j < col; j++) { 
       printf("%d\t", **(tab + i +j)); 
      } 
      printf("\n"); 
     } 
     free(tab); 
     return 0; 
    } 

danke.

+0

ja es ist eigentlich :) danke – kotasha

+0

Verwendung 'fgets' von der Tastatur zu lesen, dann' sscanf' den Wert auszulesen oder verwenden Sie einfach 'atoi' zu konvertieren. –

+0

'** (tab + i + j)' ist der falsche Weg, um auf Elemente zuzugreifen. Sie könnten 'tab [i] [j]' verwenden. –

Antwort

1

Verwenden Sie einfach [row][col] Zugriff auf Ihren Doppelzeiger. Es ist lesbarer und Sie können Fehler vermeiden, wie Sie es codiert haben.

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

int main(void) { 
    int **tab; 
    int ligne; 
    int col; 
    printf("saisir le nbre de lignes volous\n"); 
    scanf("%d", &ligne); 
    printf("saisir le nbre de colonnes volous\n"); 
    scanf("%d", &col); 

    tab = malloc(ligne*sizeof(int*)); 

    if (tab != NULL) 
    { 
     int i ,j; 
     for (i=0 ; i < ligne; i++) 
     { 
      tab[i] = malloc(col*sizeof(int)); 
      if (tab[i] == NULL) 
      { 
       fprintf(stderr, "Malloc failed\n"); 
       return 1; 
      } 

     } 
     int k=0; 
     for (i = 0; i < ligne; i++) { 
      for (j = 0; j < col; j++) { 
       tab[i][j] = k++; 
      } 
     } 
     for (i = 0; i < ligne; i++) { 
      for (j = 0; j < col; j++) { 
       printf("%d\t", tab[i][j]); 
      } 
      free(tab[i]); 
      printf("\n"); 
     } 
    } 
    free(tab); 
    return 0; 
} 
0
int main(void) { 
    int ligne; 
    int col; 
    printf("saisir le nbre de lignes volous\n"); 
    scanf("%d", &ligne); 
    printf("saisir le nbre de colonnes volous\n"); 
    scanf("%d", &col); 

    int tableSize = ligne * (col*sizeof(int)); 
    int * table = (int*) malloc(tableSize); 

    int i,j; 
    for (i=0 ; i < ligne; i++) { 
      for (j = 0; j < col; j++) { 
       *(table + i+ j) = 0; 
      } 

    } 

    for (i = 0; i < ligne; i++) { 
     for (j = 0; j < col; j++) { 
      printf("%d\t", *(table + i +j)); 
     } 
     printf("\n"); 
    } 
    free(table); 
    return 0; 
} 
0

Hier habe ich einige Änderungen gemacht und fügte einige Kommentare zu den Änderungen

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

int main(void) { 
    int **tab = NULL; 
    int ligne = 0; 
    int col = 0; 
    char buffer[128] = {0}; 

    printf("saisir le nbre de lignes volous\n"); 

    // to avoid leaving \n in buffer after you enter the first value 
    // you should also check also return value of fgets 
    // and quit program if it returns NULL 
    // in general it is good practice to check return values 
    // of all run-time functions. 

    if (fgets(buffer,sizeof(buffer),stdin)==NULL) { 
     return 1; 
    } 
    ligne = atoi(buffer); 

    printf("saisir le nbre de colonnes volous\n"); 
    if (fgets(buffer,sizeof(buffer),stdin) == NULL) { 
     return 1; 
    } 
    col = atoi(buffer); 

    tab = malloc(ligne*sizeof(int*)); // do not cast malloc 
    int i ,j; 

    // use tab[i] and tab[i][j] syntax, it is easier to read 

    for (i=0 ; i < ligne; i++) { 
     tab[i] = malloc(col*sizeof(int)); 
    } 
    for (i = 0; i < ligne; i++) { 
     for (j = 0; j < col; j++) { 
      tab[i][j] = 0; 
     } 
    } 
    for (i = 0; i < ligne; i++) { 
     for (j = 0; j < col; j++) { 
      printf("%d\t", tab[i][j]); 
     } 
     printf("\n"); 
    } 

    // before you free tab, you need to free all lines 
    for (i=0 ; i < ligne; i++) { 
     free(tab[i]); 
    } 

    free(tab); 
    return 0; 
} 
0

Wie Sie Ihre Arrays zugeordnet sind, (die eindimensional Teile) Array kann als table[i][j] angesprochen werden und nie, wie Sie in

for (i = 0; i < ligne; i++) { 
    for (j = 0; j < col; j++) { 
     **(tab + i+ j) = 0; /* <--- this is an error */ 
    } 
} 

tun, wie Sie tab + i + j ist ein po sehen Inter, auf die Sie i (die ligne Nummer) plus j (die col Nummer) und beide sind nicht eigentlich die gleiche Größe (Spalten sind eine Zelle Größe und Zeilen sind eine Zeile Größe) Sie sollten besser schreiben tab[i][j] als tab[i] ist ein Zeiger (zugeordnet mit malloc(3)), der auf ein eindimensionales Array zeigt (und die verschiedenen Zeiger tab[0], tab[1], ... tab[n] müssen nicht miteinander korreliert sein, da sie von verschiedenen malloc()-Aufrufen stammen) Wenn nicht Wie die Klammern Notation, dann sollten Sie das Äquivalent schreiben

*(*(mat + i) + j) /* equivalent to mat[i][j] */ 

und nie die Notation Sie uns e in deinem Code.

**(tab + i + j) /* equivalent to *mat[i + j] */ 
Verwandte Themen