0

我想知道以下代码中的问题。这用于首先打开一个大小为 800Mb 的文件以填充 name 变量,然后用于通过从另一个文件读取索引来访问存储在其中的数据。问题是,在读取并填充数组名称后,从它访问任何元素都会出现段错误。当在较小的数据量上测试相同的代码时,它可以工作。可能是什么原因?我运行它的硬件是英特尔 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));
    }

}
4

3 回答 3

1

这是在Linux上吗?在这种情况下,(默认情况下)来自 malloc 的非 NULL 值不会告诉您是否真的可以访问您请求的内存量。实际上,这意味着您可以分配比可用内存多得多的内存。只有当您实际访问它时,才会分配它的内存。

所以写一个简单的循环,它只是读取或写入你 malloc'ed 的每个字节,看看是否崩溃。如果是这样,那就是你的问题。

作为旁注,您是否考虑过使用mmap()来处理大文件/内存分配?

于 2013-04-13T14:15:40.113 回答
1

您的分配存在一个潜在问题name

char** name;
name = (char**)malloc(MAXINT*sizeof(char*));

name被定义为一个指向指针的指针,它是一个指针数组。该代码正在分配MAXINT指针数量,这是一个非常大的数字。您需要检查是否next成功分配或NULL删除了指针,即是否malloc成功。

同样,name[i] = malloc(20)也应该检查NULL指针,因为您的系统可能会耗尽内存。

于 2013-04-13T13:20:54.543 回答
0

我想name = (char**)malloc(MAXINT*sizeof(char*));实际上失败了,您应该在那里检查 NULL 返回值。

于 2013-04-13T14:22:36.580 回答