C 为什么我的程序最后会崩溃,即使它执行的所有操作都很好?

C 为什么我的程序最后会崩溃,即使它执行的所有操作都很好?,c,arrays,pointers,multidimensional-array,C,Arrays,Pointers,Multidimensional Array,我有下一个代码,我想读一个2D数组。它会这样做,但在程序结束后,每次程序都会崩溃。我有一个更大的计划,但这是唯一的问题。我还阅读并调试了该程序 问题是:为什么程序最终会崩溃,即使它在整个预期的操作过程中运行良好 void dynamicMemAlloc(int n, int (**arrayPointer)[n][n]){ *arrayPointer = malloc(sizeof(int[n][n])); assert(*arrayPointer != NULL); } vo

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

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

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;
}
void dynamicmeAlloc(int n,int(**arrayPointer)[n][n]){
*arrayPointer=malloc(sizeof(int[n][n]);
断言(*arrayPointer!=NULL);
}
void readMy2Darray(整数n,整数数组[n][n]){
int i,j;
对于代码中的(i=1;i)

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

for(i=1;i在本例中,第四个scanf将写入malloc()d数组的末尾,并可能覆盖malloc()簿记,从而使free()调用陷入麻烦


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

为什么我的程序即使工作正常也会崩溃?
…这是什么样的语句?您试图从堆中释放未分配的内存。您应该阅读c中的内存管理工作原理。我没有我想说的是,一个程序怎么可能在崩溃时正常工作?这很容易-我已经做了很多次了。只是破坏了堆栈上的main()返回地址。结果-'correct'操作和main()上的segfaultreturn。我理解,但打印功能即使从1开始也可以正常工作。@Timʘɫei读到了。我以前一直使用您建议的版本,直到大约一周。这就是问题所在。谢谢。
for(i = 0; i < n; i++)
        for(j = 0; j < n; j++)