我想知道以下代码中的问题。这用于首先打开一个大小为800Mb的文件来填充名称变量,然后通过读取另一个文件中的索引来访问存储在其中的数据。问题是在读取并填充数组名称后,从中访问任何元素会产生seg错误。当在较小的数据大小上测试相同的代码时,它起作用。可能是什么原因?我运行的硬件是intel i5芯片上的4GB RAM,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));
}
}
答案 0 :(得分:1)
您分配name
时存在一个潜在问题。
char** name;
name = (char**)malloc(MAXINT*sizeof(char*));
name
被定义为指向指针的指针,指针是一个指针数组。代码分配MAXINT
个指针数,这是一个非常大的数字。您需要检查是否已成功分配next
或删除了NULL
指针,即malloc
是否成功。
同样,还应检查name[i] = malloc(20)
NULL
指针,因为系统可能会耗尽内存。
答案 1 :(得分:1)
这是在Linux上吗?在这种情况下,(默认情况下)来自malloc的非NULL值不会告诉您实际上是否可以访问您请求的内存量。实际上,这意味着你可以使用malloc远远超过你可用的内存。只有当你真正访问它时,才会分配内存。
所以写一个简单的循环,它只是读取或写入你malloc的每个字节,看看是否崩溃。如果确实如此,那么这就是你的问题。
作为旁注,您是否考虑过使用mmap()来处理大文件/内存分配?
答案 2 :(得分:0)
我认为name = (char**)malloc(MAXINT*sizeof(char*));
实际上失败了,你应该检查那里的NULL返回值。