【问题标题】:Why does my program crash at the end even if it executes all the operations just fine?为什么我的程序即使执行所有操作都很好,但最后还是会崩溃?
【发布时间】:2017-05-16 10:05:40
【问题描述】:

我有下一个要读取二维数组的代码。它会这样做,但在程序结束后,程序每次都会崩溃。我有一个更大的程序,但这是唯一的问题。我还阅读了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;
}

【问题讨论】:

  • Why does my program crash even if it works fine?...这是什么声明?
  • 您尝试释放未从堆中分配的内存。您应该阅读 c 中的内存管理是如何工作的。
  • 我不知道该怎么说我想说的话
  • 程序崩溃时怎么可能正常工作?
  • 这很容易做到——我已经做了很多。只需破坏堆栈上的 main() 返回地址。结果 - main() 返回时的“正确”操作和段错误。

标签: c arrays pointers multidimensional-array


【解决方案1】:

在你的代码中

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开始也可以正常工作。
  • @Timʘɫei 了解undefined behavior
  • 我曾经使用你建议的版本,直到大约一个星期。这就是问题所在。谢谢。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2016-05-09
    • 2017-03-26
    相关资源
    最近更新 更多