2017-11-08 12 views
-1

私は、char *を1つの文字に分割してchar **を返すクラスを持っています。私はメモリを割り当てて特定の時点で値を与えることができますが、それを返そうとするまでには完全に欠落しています。なぜ私のポインタが消えていますか?

char **makeSentences(char *chapter, int *nSentences){ 
int num = *nSentences; 
char* chap = chapter; 
char **sentences; 
sentences = (char**) malloc(sizeof(char*) * num); 
int stops[num + 1]; 
stops[0] = 0; 
int counter = 0; 
int stop = 1; 
while (chap[counter] != '\0'){ 
    if (chap[counter] == '.'){ 
     stops[stop] = counter + 1; 
     printf("Place: %d\nStop Number: %d\n\n", counter, stop); 
     stop++; 
    } 
    counter++; 
} 
for (int i = 0; i < num; i++){ 
    int length = stops[i+1] - stops[i]; 
    char characters[length+1]; 
    memcpy(characters, &chap[stops[i]], length); 
    characters[length] = '\0'; 
    char *sentence = characters; 
    sentences[i] = sentence; 
    printf("%s\n",sentence); 
    printf("%s\n", sentences[i]); 
} 
char* testChar = sentences[0]; 
printf("%s\n", sentences[0]); 
printf("%s]n", testChar); 
return sentences; 
} 

最後の2つの印刷行は、改行以外は印刷しませんが、同じ行(forループ内)は期待どおりに印刷されます。ここで何が起こっているのですか?

答えて

2

問題は、これらの3つのラインである:あなたがローカル変数へのポインタを保存する。ここ

char characters[length+1]; 
char *sentence = characters; 
sentences[i] = sentence; 

。その変数charactersは、ループの繰り返しごとに範囲外になり、迷惑ポインタの「配列」が残されます。

ほとんどのシステムはstrdup関数を持っていますが、これはmallocstrcpyを呼び出して文字列を複製します。私はあなたがそれを使うことを提案する(またはあなた自身で実装する)ことをお勧めします。

+0

ありがとうございます、それは物事をクリアします。 – JC97

+0

@ JC97あなたが満足している場合は、回答に同意してください。それは[ツアー](https://stackoverflow.com/tour)でそれを行う方法について記述されています。 – klutt

関連する問題