ファイルからすべての単語を 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回減らしても、セグメンテーション違反が発生します。