为什么这个程序不创建核心转储?

Why is this program not creating a core dump?

根据 this question and this one,只要您关闭操作系统,操作系统就会释​​放您在程序中分配的所有内容,而且在像我这样的简单程序中,它并不那么重要。

Sure in very short running simple programs, failing to free memory won't have a noticeable effect. jaredpar

据人说:

The malloc() function allocates size bytes [...]

因此,我使用 malloc 分配了一个具有 20 字节 内存的整数数组(sizeof int4 字节 在我的系统上):

array = malloc(5 * sizeof(int));

因此我应该只能写出 5 个整数(5 * 4 字节 = 20 字节 = 5 个整数)。现在这里的程序应该创建一个核心转储,但由于某些原因,情况并非如此:

#include <stdio.h>
#include <stdlib.h>

int main(void){

        int *array = NULL, i = 0;

        array = malloc(5 * sizeof(int));

        if(array == NULL)
        {
                printf("\nERROR : Out of memory.\n");
                return 1;
        }

        for(i = 0; i < 10; i++)
                scanf("%d", &array[i]);

return 0;

}

这个程序让我输入 10 个整数而不创建核心转储...相反,在程序末尾使用 free(array) 将正确地导致创建核心转储。这不奇怪吗?这两个程序不应该创建核心转储吗?为什么不使用 free() 不会创建核心转储? 我知道核心转储是什么以及如何避免它,我的问题纯粹是出于好奇,因为对我来说,这是一种奇怪的行为。

Shouldn't both programs create a core dump?

可以,但不必

你的程序执行了未定义的行为,执行该程序的结果是未定义的:

  • 可以成功退出,
  • 它可能会中止,
  • 它可能会因分段错误而崩溃,
  • 它会融化你的 CPU,
  • 它可以发射核导弹。

这就是未定义行为的含义:任何事情都可能发生。

您对 特定 事情会发生的预期是不正确的。