读书人

segmentation fault 异常 代码如下

发布时间: 2012-02-13 17:20:26 作者: rapoo

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这么大的内存.
用内存映射文件吧
[解决办法]
大文件的读取,把文件一部分一部分的映射到内存.而不是一次全部读.

读书人网 >C语言

热点推荐