2014-03-25 72 views
1

我正在写一个C程序,其中我尝试动态分配一个2-dim数组(或数组数组)。在表分配后,我试着迭代它,但它抛出关于非法内存访问的错误并创建一个coredump。表中的边框值覆盖邻居

经过一番研究,我发现了一种奇怪的事:余与实验阵列是4×4,但是当我设置array[0][3] = 123;它设置既[0] [3]和[1] [0]的位置为123如果我将array[1][0] = 123;分配给版权值,因为它将[0] [3]和[1] [0]都设置为版权值,所以会发生完全相同的情况。对任何“边界值”(如[2] [0]和[1] [3])进行类似的分配。我想我的配置一定是错的,但我无法弄清楚。我非常确定这是动态分配多光暗阵列的方式,一些研究证实了这一点。这里是我的代码(我知道这应该是SSSCE,但我无法提供更短,仍然显示问题):

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]); 

我的内存分配是否错误,或者是我看不到的其他问题。我会很感激任何建议或帮助。先谢谢你。

+2

男人,在没有发现任何明确的错误代码后,我决定运行它。它工作得很好。 确保您正在编译和测试代码的最新版本。如果它没有解决,编译器可能会有一个“问题” – Inox

+0

今天再次运行它没有进展。由于这是学术性的东西,我正在用GCC编译它。仍然,将数组[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;