2016-11-04 3 views
0

이 프로그램을 실행할 때 문제가 발생했습니다. 단순히 선택한 값을 가진 다차원 배열에 동적으로 할당하고 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]으로 해결할 수 있습니다 , 결코 당신이 tab + i + j 볼 당신이

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

에서와는 포 없다 (ligne 숫자)와 j (col 숫자)을 모두 상쇄 한 둘 다 실제로 같은 크기가 아닙니다 (열은 한 셀 크기이고 행은 한 줄 크기 임) tab[i][j]tab[i]으로 작성하는 것이 좋습니다. 단일 차원 배열을 가리키는 포인터 (malloc(3)으로 할당 됨) 및 다른 포인터 tab[0], tab[1], ... tab[n]은 고유 한 malloc() 호출에서 오는 것과 같이 이들 사이에 상관 될 필요가 없습니다. 대괄호 표기법과 마찬가지로

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

등으로 작성해야합니다. 전자 코드.

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