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

C 为什么这个程序不创建核心转储?,c,memory-management,segmentation-fault,malloc,free,C,Memory Management,Segmentation Fault,Malloc,Free,根据和的说法,只要你关闭程序,操作系统就会释放你在程序中处理的任何内容,而且在像我这样的简单程序中,这并不重要 当然,在很短的时间内运行简单的程序,无法释放内存 不会有明显的效果 据曼恩说: 函数的作用是分配大小字节[…] 因此,我使用malloc分配了一个内存20字节的整数数组(sizeof intis4字节): 因此,我应该能够只写5个整数(5*4字节=20字节=5个整数)。现在这个程序应该创建一个内核转储,但由于某些原因,情况并非如此: #include <stdio.h> #

根据和的说法,只要你关闭程序,操作系统就会释放你在程序中处理的任何内容,而且在像我这样的简单程序中,这并不重要

当然,在很短的时间内运行简单的程序,无法释放内存 不会有明显的效果

据曼恩说:

函数的作用是分配大小字节[…]

因此,我使用malloc分配了一个内存20字节的整数数组(
sizeof int
is4字节):

因此,我应该能够只写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;

}
#包括
#包括
内部主(空){
int*array=NULL,i=0;
数组=malloc(5*sizeof(int));
if(数组==NULL)
{
printf(“\n错误:内存不足。\n”);
返回1;
}
对于(i=0;i<10;i++)
scanf(“%d”和数组[i]);
返回0;
}
该程序允许我输入10个整数,而无需创建核心转储…相反,在程序末尾使用
free(array)
将正确地创建核心转储。这不是很奇怪吗?两个程序不都应该创建核心转储吗?为什么使用free()不能创建核心转储? 我知道什么是核心转储,以及如何避免它,我的问题纯粹是好奇,因为对我来说,这是一种奇怪的行为

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

可以,但不必

您的程序执行未定义的行为,并且执行该程序的结果未定义:

  • 可以顺利退出,
  • 它可能会流产
  • 它可能会因分段故障而崩溃
  • 它会融化你的CPU
  • 它可以发射核导弹
这正是未定义行为的含义:任何事情都可能发生


您对某一特定事件发生的预期是不正确的。

因为未定义的行为是未定义的。你不能期望它有明确的行为。另外,如果(array==NULL),则使用
if
。该行为未被C标准定义,这意味着任何事情都是允许发生的。一个编译器/库可以毫无问题地构建代码,而另一个编译器/库可能只会导致崩溃。一个可能的结果是行为举止让人觉得没有什么不对。另一个可能的结果是表现得好像什么都没有错,然后在下一个蓝月亮上崩溃。它不会总是指出任何东西。您可能会创建未定义的行为,并让
free
finish没有明显的问题。@Claudio不,您对它的工作原理非常困惑。不存在“应导致堆芯转储”的情况。只有“可能导致堆芯转储”。如果程序中有内存错误,任何事情都可能发生。它可能会导致堆芯转储,或者可能会导致奇怪的行为,或者根本无法检测到。所有的赌注都输光了。与免费的类似。您不能依靠
free
来为自己捕获bug。如果您有内存错误,
free
可能会检测到它,或者它可能会导致内核转储,或者它可能根本不起任何作用。调用
free
可能会导致内核转储,因为您覆盖了控制内存分配的一些libc数据结构,而
free
依赖这些结构。幸运的是,它立即导致了内核转储,而不仅仅是奇怪的行为。
#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;

}