segmentation fault 错误 代码如下
在REDHAT 4.2 下使用gcc编译器编译通过,但是运行时出现segmentation fault错误提示,请指教:(读取8G数据到内存并打印到屏幕,运行时出现time 0: 6 ……time 4: 6 DATA1: segmentation fault)
#define _CRT_SECURE_NO_DEPRECATE 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
unsigned int *data1;
unsigned int *data2;
time_t time_0;
int main()
{
FILE *fp;
int i;
unsigned long long n, data_size;
char file_name[32];
// data1 申请5G空间
data1 = (unsigned int *)malloc( ((unsigned long long)5) < <30 );
// data2 申请3G空间
data2 = (unsigned int *)malloc( ((unsigned long long)3) < <30 );
time( &time_0 );
data_size = 0;
for(i=0; i <5; i++)
{
sprintf(file_name, "%d.dat ", i);
if( (fp=fopen(file_name, "rb ")) == NULL )
{
printf( "Can not open the file %s!\n ", file_name);
exit(1);
}
n = fread(data1+data_size, 4, 1 < <28, fp);// 1 < <30
data_size += (n < <7);
fclose(fp);
printf( "time %d: %8ld\n ", i, time(0)-time_0);
}
printf( "DATA1:\n ");
for(i=0; i <20; i++)
{
printf( "%08x\n ", data1[data_size-(1 < <i)]);
}
printf( "\n ");
data_size = 0;
for(i=5; i <8; i++)
{
sprintf(file_name, "%d.dat ", i);
if( (fp=fopen(file_name, "rb ")) == NULL )
{
printf( "Can not open the file %s!\n ", file_name);
exit(1);
}
n = fread(data2+data_size, 4, 1 < <28, fp);
data_size += (n < <7);
fclose(fp);
printf( "time %d: %8ld\n ", i, time(0)-time_0);
}
printf( "DATA2:\n ");
for(i=0; i <20; i++)
{
printf( "%08x\n ", data2[data_size-(1 < <i)]);
}
printf( "\n ");
free(data1);
free(data2);
return 0;
}
[解决办法]
你的操作系统是多少位的?
32位就别想了,64位的话还有可能,不过也很难拿到5G这么大的内存.
用内存映射文件吧
[解决办法]
大文件的读取,把文件一部分一部分的映射到内存.而不是一次全部读.