根据这个问题和这个问题,只要你关闭它,操作系统就会释放你在程序中错误定位的东西,而且在像我这样的简单程序中,它并不那么重要。
当然在很短的时间内运行简单的程序,无法释放内存 不会有明显的效果。 贾雷德帕
尔
据人说:
malloc() 函数分配大小字节 [...]
因此,我使用 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 个整数而无需创建核心转储......相反,在程序末尾使用 free(array)
将正确导致创建核心转储。这不是很奇怪吗?两个程序不应该创建一个核心转储吗?为什么不使用 free() 不会创建核心转储?我知道什么是核心转储以及如何避免它,我的问题纯粹是好奇,因为对我来说,这是一种奇怪的行为。
两个程序不应该创建一个核心转储吗?
它可以,但不必。
您的程序执行未定义的行为,并且执行此类程序的结果是未定义的:
- 它可以成功退出,
- 它可能会中止,
- 它可能会因分段错误而崩溃,
- 它可能会融化你的CPU,
- 它可以发射核导弹。
这正是未定义行为的含义:任何事情都可能发生。
你对特定事情会发生的预期是不正确的。