2017-03-20 6 views
1

私のコードで問題がわからないとき。このプログラムの目的は、テキストファイルから単語を読み取り、リンクされたリストに追加することです。これを実行すると、次のようになります。文字列を解放しようとしたときに無効な次のサイズ(速い)

static char *make_string(char buffer[], int length) { 
     char *str = (char *)(malloc(length+1)); 
     memcpy(str, buffer, length); 
     str[length + 1] = '\0'; 
     return str; 
    } 

char *words_next_word() { 
    char buf[MAXBUF] = {0}; 

    int character = getchar(); 
    int index = 0; 
    static int count = 0; 
    printf("it is the %d word \n", count); 
    count++; 

    while(isalnum(character) == 0){ 
    character = getchar(); 
    } 

    while(character != EOF && isalnum(character) != 0){ 
    buf[index] = character; 
    index++; 
    character = getchar(); 
    } 

    return make_string(buf, index); 
} 

テキストファイルから単語を取得した後、リンクリストに追加します。単語を追加した後、私は文字列を解放します。最初の138語が読み込まれ、問題なく解放されます。何らかの理由で、138番目の単語を読み込もうとするとプログラムがクラッシュしますが、その理由はわかりません。

+0

ヒントへの書き込みを制限するものではありません: ''ちょうど戻りstrの前に 'STR [長さ]の値がどのようなものですか;'? – chux

+3

'str [length + 1] = '\ 0';'境界外の書き込み、未定義の動作です。 – EOF

+0

このコードが138番目の単語ではなく、138番目の単語で機能する理由はありますか? –

答えて

0

最初の138ワードが読み込まれ、問題なく解放されます。

実際はありません。この問題は、最初のmake_string()コールでも発生します。


コードが文字列を複製しようとしましたが、オフラインでエラーが発生しています。

static char *make_string(char buffer[], int length) { 
     char *str = (char *)(malloc(length+1)); // size good 
     memcpy(str, buffer, length);    // copy OK 
     str[length + 1] = '\0';  // null character assigned in wrong place, 1 too far out 
     return str; 
    } 

間違った場所(境界@EOFから割り当て)にデータを割り当て、ヌル文字でstr[length]の値を定義する(以降、それを使用して)しない未定義の動作もたらします。

Hereは、strdup()の機能ですが、ご確認の前にmake_string()の修理コードの作成をおすすめします。


以下のコードは、buf[]

while(character != EOF && isalnum(character) != 0){ 
    if (index + 1 >= MAXBUF) { 
     puts("Too long"); 
     return NULL; // or some other error handling 
    } 
    buf[index] = character; 
関連する問題