为什么我的程序在最后崩溃,即使它执行所有操作都没问题呢?

时间:2017-05-16 10:05:40

标签: c arrays pointers multidimensional-array

我有下一个想要读取2D数组的代码。它会这样做,但在程序结束后,程序每次都会崩溃。我有一个更大的计划,但这是唯一的问题。我还阅读了Correctly allocating multi-dimensional arrays并调试了该程序。

问题是:为什么程序在结束时会崩溃,即使它在整个预期的操作过程中运行良好?

void dynamicMemAlloc(int n, int (**arrayPointer)[n][n]){
    *arrayPointer = malloc(sizeof(int[n][n]));
    assert(*arrayPointer != NULL);
}

void readMy2Darray(int n, int array[n][n]){
    int i, j;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            scanf("%d", &array[i][j]);
}
void printMy2Darray(int n, int array[n][n]){
    int i, j;
    for(i = 1; i <= n; i++){
        for(j = 1; j <= n; j++)
            printf("%d ", array[i][j]);
        printf("\n");
    }
}
int main(void){
    int n;
    printf("Read the dimension(n): ");
    scanf("%d", &n);
    int (*arrayPointer)[n][n];
    dynamicMemAlloc(n, &arrayPointer);
    printf("Read the 2D array:\n");
    readMy2Darray(n, *arrayPointer);
    printf("Printed array:\n");
    printMy2Darray(n, *arrayPointer);
    free(arrayPointer);
    return 0;
}

The error here

2 个答案:

答案 0 :(得分:6)

在您的代码中

for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)

一个人走了。 C数组是基于0的索引。您应该将循环条件设置为

for(i = 0; i < n; i++)
        for(j = 0; j < n; j++) 

否则,它会导致undefined behavior

答案 1 :(得分:1)

在这种情况下,第四个scanf将写入malloc()d数组的末尾,并可能覆盖malloc()簿记,使free()调用遇到麻烦。

但正如另一个答案中所指出的,所有这些都取决于未定义的行为,并且将是特定于实现的。