【发布时间】:2013-04-13 22:23:23
【问题描述】:
我想知道以下代码中的问题。这用于首先打开一个大小为 800Mb 的文件以填充 name 变量,然后用于通过从另一个文件读取索引来访问存储在其中的数据。问题是,在读取并填充数组名称后,从它访问任何元素都会出现段错误。当在较小的数据量上测试相同的代码时,它可以工作。可能是什么原因?我运行它的硬件是 4gb RAM,intel i5 芯片上的 32 位 linux 版本。
#include <stdio.h>
#define MAXINT 61578414
int main(int argc,char** argv){
printf("Starting \n");
FILE* fp1 = fopen(argv[1],"r");
FILE* fp2 = fopen(argv[2],"r");
char** name;
name = (char**)malloc(MAXINT*sizeof(char*));
char* tname;
int i = 0;
int tmp1;
//reading to fill in name
while(i < MAXINT){
name[i] = (char*)malloc(20);
fscanf(fp1,"%d%s",&tmp1,name[i]);
i++;
}
//accessing elements from name
int i1,i2;
while(!feof(fp2)){
fscanf(fp2,"%d%d",&i1,&i2);
fprintf(stdout,"%s %s\n",*(name+i1),*(name+i2));
}
}
【问题讨论】:
-
1) 包括
2) 不要转换 malloc() 的返回值。 3) feof() 总是错误的。 4) name[i1]比*(name+i1)更容易阅读 5) (minor) main() 应该返回一个 int 值,在大多数情况下为零。 -
查看
malloc的返回值。 -
我也没有看到分配的内存在任何地方被释放?
-
是的,将合并更改,但问题是
name[i1]我遇到了分段错误。 -
@MartinWickman 不需要上述条件。
i1和i2应在(0, MAXINT - 1)范围内