2014-03-25 5 views
1

2 차원 배열 (또는 배열 배열)을 동적으로 할당하려고하는 C 프로그램을 작성하고 있습니다. 테이블을 할당 한 후에는 반복을 시도하지만 불법 메모리 액세스에 대한 오류를 던지고 코어 덤프를 만듭니다. I는 실험 어레이는 4 × 4,하지만 array[0][3] = 123; 설정할 때 모두 [0] [3] [1] [0]의 위치가 될 (123)를 설정테이블의 경계 값 이웃을 덮어 씁니다.

일부 조사 후 I 호기심 것을 발견했다array[1][0] = 123;을 지정하면 정확하게 [0] [3]과 [1] [0] 모두를 rightside 값으로 설정하므로 똑같은 일이 발생합니다. 유사한 할당은 [2] [0]과 [1] [3]과 같은 "경계 값"에 대해 수행됩니다. 내 할당에 문제가있는 것 같지만, 알아낼 수는 없습니다. 필자는 이것이 멀티 - 딤 배열을 동적으로 할당하는 방법이며, 약간의 연구가이를 확인했다고 확신했습니다.

typedef struct { 
    int rows; 
    int columns; 
    double **data; 
} matrix; 


matrix* allocateMatrix(int inputRows, int inputColumns) { 
    matrix *matrixPointer = calloc(1, sizeof(matrix)); 
    matrixPointer->rows = inputRows; 
    matrixPointer->columns = inputColumns; 
    #ifdef DOUBLE 
     matrixPointer->data = calloc(inputRows, sizeof(double*)); 
    #else 
     matrixPointer->data = calloc(inputRows, sizeof(float*)); 
    #endif 
    if (matrixPointer->data == NULL) { 
     printf("Error - inputRows value appears to be wrong."); 
     return NULL; 
    } 

    int i, j; 
    for (i = 0; i < inputRows; i++) { 
    #ifdef DOUBLE 
     matrixPointer->data[i] = calloc(inputColumns, sizeof(double)); 
    #else 
     matrixPointer->data[i] = calloc(inputColumns, sizeof(float)); 
    #endif 
     if (matrixPointer->data[i] == NULL) { 
      printf("Error - inputColumns value appears to be wrong."); 
      return NULL; 
     } 
    } 
    matrixPointer->data[2][0] = 123; //TEST CODE; 

    return matrixPointer; 
} 

및 생성 된 배열의 내용을 볼 수있는 몇 가지 코드 :

matrix *lol = allocateMatrix(4, 4); 
    int i, j; 
    for (i = 0; i < lol->rows; i++) 
      for (j = 0; j < lol->columns; j++) 
       printf("%f ", lol->data[i][j]); 
을 여기에 내 코드 (나는 그것이 SSSCE해야하지만 문제는 짧은 제공 여전히 표시 할 수 없습니다 알고)입니다

내 메모리 할당이 잘못되었거나 볼 수없는 다른 문제 일 수 있습니다. 제안이나 도움에 감사드립니다. 미리 감사드립니다.

+2

사람이 코드에서 명확한 실수를 찾지 못한 채로 실행하기로 결정했습니다. 그것은 잘 작동합니다. 코드의 최신 버전을 컴파일하고 테스트해야합니다. 문제가 해결되지 않으면 컴파일러에 "문제"가있을 수 있습니다. – Inox

+0

오늘 다시 실행하십시오. 이것이 학술적 자료이기 때문에 나는 GCC로 그것을 컴파일하고있다. 여전히 array [1] [0]을 123으로 설정하면 [1] [0]과 [0] [3]이 모두 123으로 설정됩니다. – 3yakuya

답변

1
typedef struct { 
    int rows; 
    int columns; 
    double **data; 
} matrix; 

이것은 범인입니다. DOUBLE 매크로 정의는 코드를 통해 배정도를 사용할 수 있지만 플래그가 설정되지 않은 경우 코드는 여전히 double** data으로 할당되어 가능한 분할 오류를 일으 킵니다. 이 경우의 올바른 코드는 다음과 같아야합니다.

typedef struct { 
    int rows; 
    int columns; 
    #ifdef DOUBLE 
     double **data; 
    #else 
     float **data; 
    #endif 
} matrix;