0

次のコードの問題を知りたかったのです。これは、最初にサイズ 800Mb のファイルを開いて name 変数を入力するために使用され、後で別のファイルからインデックスを読み取ることによって、そこに格納されているデータにアクセスするために使用されます。問題は、配列名を読み取って入力した後、そこから任意の要素にアクセスすると、seg fault が発生することです。小さいデータ サイズで同じコードをテストすると、うまくいきました。その理由は何ですか?これを実行しているハードウェアは、Intel i5 チップ上の 4 GB 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 できることを意味します。メモリが割り当てられるのは、実際にアクセスしたときだけです。

そのため、malloc した各バイトを読み書きする単純なループを作成し、それがクラッシュするかどうかを確認します。もしそうなら、それはあなたの問題です。

補足として、代わりにmmap()を使用して大きなファイル/メモリの割り当てを処理することを検討しましたか?

于 2013-04-13T14:15:40.113 に答える