2

ファイルからすべての単語を char* に抽出する関数を作成しています。最初は単に char * を返すようにしていましたが、それを変更して、悪い習慣と言われていることを避けようとしました。要約されたコードは次のとおりです。

int main(int argc, char * argv[]){
    char ** searchWords;
    FILE * fp = fopen("input.txt", "r");
    getSearchWords(&searchWords, fp);

    return 0;
}


void getSearchWords(char *** searchWordList, FILE * searchFile){ 

    int wordIndex = 0, scalar = 1;
    char ** searchList = malloc(sizeof(char*)*DEFAULT_SEARCH_LENGTH);

    for(int i = 0; i < DEFAULT_SEARCH_LENGTH; i++)
    *(searchList + i) = malloc(sizeof(char)* MAX_SEARCH_LENGTH);

    while(fgets(*(searchList + wordIndex), MAX_SEARCH_LENGTH + 1, searchFile)!= NULL){

        if(wordIndex == (DEFAULT_SEARCH_LENGTH*scalar - 1 )){
            scalar++;
            searchList = realloc(searchList, sizeof(char *) * DEFAULT_SEARCH_LENGTH*scalar);

        for(int i = wordIndex+1; i < DEFAULT_SEARCH_LENGTH*scalar ; i++)
            *(searchList + i) = malloc(sizeof(char) * MAX_SEARCH_LENGTH );
        }// if

        wordIndex++;

    }// while

    fclose(searchFile);
    printf("%d\n", wordIndex);
    for(int i = 0; i < wordIndex; i++){
        *(searchWordList + i) = (searchList + i);
        printf("%s\n", **(searchWordList + i));
    }
}

セグメンテーション違反は最後のforループから発生していますが、gdbを実行すると、これが得られ、その理由や対処法がわかりません:

Program received signal SIGSEGV, Segmentation fault.    
0x00000000006034c8 in ?? ()   
(gdb) bt    
#0  0x00000000006034c8 in ?? ()    
#1  0x00000000006034d0 in ?? ()    
#2  0x00000000006034d8 in ?? ()    
#3  0x00000000006034e0 in ?? ()    
#4  0x00000000006034e8 in ?? ()    
#5  0x00000000006034f0 in ?? ()   
#6  0xf9d384796456d39a in ?? ()   
#7  0x00000000004009e0 in __ctype_b_loc@plt ()
#8  0x00007fffffffe850 in ?? ()
#9  0x0000000000000000 in ?? ()

ありがとう

編集:入力ファイル「input.txt」には、1行に15個の単語が含まれていることを忘れていました。最後の for ループでは、それらすべてを出力してから、セグメンテーション違反に遭遇します。さらに、ループの反復回数を1回減らしても、セグメンテーション違反が発生します。

4

0 に答える 0