首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

segmentation fault 异常 代码如下

2012-02-13 
segmentation fault 错误 代码如下在REDHAT4.2下使用gcc编译器编译通过,但是运行时出现segmentationfault

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

热点排行