2016-11-04 4 views
0

私はこのプログラムを実行するときに実行の問題がありました。選択した値を持つ多次元配列を動的に割り当て、それをゼロにするだけです。それは正しくコンパイルされますが、実行されません。多次元配列を動的に割り当てる

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

ありがとうございます。

+0

ええ、実際にそれはあなたがして 'sscanf'が値を読み出したり、単純に変換する' atoi'を使用するには、キーボードからの読み取りに 'fgets'を使用 – kotasha

+0

感謝:)です。 –

+0

'**(tab + i + j)'は要素にアクセスするには間違った方法です。 'tab [i] [j]'を使うことができます。 –

答えて

1

ダブルポインタに簡単な[row][col]アクセスを使用してください。より読みやすく、コード化したときにエラーを避けることができます。ここで

#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

、私はあなたの配列、(1次元の部分)を割り当てられてきたように、あなたの配列がtable[i][j]として取り組むことができるいくつかの変更を行なったし、変更

#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

にいくつかのコメントを追加しました、そして決してあなたがtab + i + j見るようにあなたが

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

にそうであるようには経口ではありません(ligneの数値)とjcolの数値)をオフセットし、実際には同じサイズではありません(列は1つのセルサイズで、行は1行のサイズです)tab[i][j]tab[i]と書くとよいでしょう。 1つの次元の配列を指すポインタ(malloc(3)で割り振られています)と異なるポインタtab[0]tab[1]、... tab[n]は、別々のmalloc()コールから来るので、それらの間に相関関係はありません)ブラケット表記のように、あなたはあなたに私たちを同等

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

、決して表記を書く必要がありますあなたのコードにe。

**(tab + i + j) /* equivalent to *mat[i + j] */ 
関連する問題