使用malloc()后尝试初始化变量时,应用程序崩溃。
使用free()或将错误的代码块放在其他2之上可以解决所有问题,但是为什么呢?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
int main()
{
LARGE_INTEGER startTime, endTime, ticksPerSecond;
int a = 10000;
int b = 25000;
float *allocazione;
QueryPerformanceFrequency(&ticksPerSecond);
QueryPerformanceCounter(&startTime);
allocazione = (float*)malloc(a*b*sizeof(float));
QueryPerformanceCounter(&endTime);
printf("Tempo di allocazione con malloc : \n%g\n", (double)(endTime.QuadPart - startTime.QuadPart)/(double)ticksPerSecond.QuadPart);
free(allocazione); //Commenting this causes the application to crash. Why?
QueryPerformanceCounter(&startTime);
allocazione = (float*)calloc(a*b,sizeof(float));
QueryPerformanceCounter(&endTime);
printf("Tempo di allocazione con calloc : \n%g\n", (double)(endTime.QuadPart - startTime.QuadPart)/(double)ticksPerSecond.QuadPart);
free(allocazione); //Commenting this causes the application to crashes. Why?
//Having the piece of code on top solves all the issues. Why?
QueryPerformanceCounter(&startTime);
allocazione = (float*)malloc(a*b*sizeof(float));
for(int i = 0; i < a; i++)
for (int j = 0; j < b; j++)
*(allocazione + i * b + j) = 0.0f; //Application crash!!!
QueryPerformanceCounter(&endTime);
printf("Tempo di allocazione con malloc + for loop per inizializzare : \n%g\n", (double)(endTime.QuadPart - startTime.QuadPart)/(double)ticksPerSecond.QuadPart);
return 0;
}
答案 0 :(得分:3)
每个分配用于2.5亿float
秒,需要稳定的GB内存。奇怪的是,您正在构建一个32位应用程序,这意味着您只有2 GB(对于特殊OS配置可能为3 GB)的用户虚拟内存地址空间。
由于未通过free
,您正在尝试分配三个1 GB的块,这不适合; malloc
或calloc
调用之一可能失败,并且您没有检查返回值,因此甚至看不到它。当您尝试使用失败分配中的NULL
返回时,就会崩溃。