2016-11-04 2 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

да на самом деле это :) спасибо – kotasha

+0

использовать 'fgets' для чтения с клавиатуры, а затем' sscanf' для считывания значения или просто использовать 'atoi' для преобразования. –

+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

Вот, я сделал некоторые изменения и добавлены некоторые комментарии к изменениям

#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

Как вы выделили свои массивы (одномерное части) ваш массив может быть решена, как table[i][j] и никогда, как вы в

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

как вы видите tab + i + j не является ро inter, к которому вы смели i (номер ligne) плюс j (номер col), и оба они фактически не имеют одинакового размера (столбцы - один размер ячейки, а строки - один размер строки). Лучше написать tab[i][j], так как tab[i] is указатель (выделен 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] */