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

时间:2016-01-17 12:13:02

标签: c memory-management segmentation-fault malloc free

根据this questionthis one,只要您关闭它,操作系统就可以释放您在程序中编辑的监视器,而且在像我这样的简单程序中,操作系统可以解决问题。不那么重要。

  

确保在非常短的时间内运行简单的程序,无法释放内存   不会有明显的效果。 jaredpar

据男人说:

  

malloc()函数分配 size bytes [...]

所以,我已经使用malloc来分配一个整数数组,其中 20字节的内存(sizeof int 4字节在我的系统上):

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个整数而不创建coredump ...而是在程序结束时使用free(array)将正确地导致创建核心转储。难道不奇怪吗?两个程序都不应该创建核心转储吗?为什么不使用free()不会创建核心转储? 我知道核心转储是什么以及如何避免它,我的问题纯粹是好奇心,因为对我来说,这是一种奇怪的行为。

1 个答案:

答案 0 :(得分:2)

  

两个程序都不应该创建核心转储吗?

可以,但不得

您的程序练习未定义的行为,并且执行此类程序的结果未定义:

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

完全未定义的行为意味着什么:任何事情都可能发生。

您希望发生特定事情是不正确的。