我有下一个想要读取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;
}
答案 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()调用遇到麻烦。
但正如另一个答案中所指出的,所有这些都取决于未定义的行为,并且将是特定于实现的。