1

ユーザーの入力を取り込んで印刷する簡単なプログラムを書こうとしています。ユーザーが入力するまでこれを続けます"done"

以下のコードを実行すると、「01」と入力して、を取得しSegmentation Fault ( core dumped )ます。

これは何か関係があると思いますがgetline()、わかりません。なぜそれが機能しないのか、そしてそれを修正する方法を誰かが私に説明してくれれば幸いです。

#include <stdio.h>
#include <stdlib.h>

int main(){

char* line;
size_t size ;
size = 100;
char* done;
done = "done";
printf("0");
while ( strcmp(line, "done") != 0 ) { 
    printf("1");
    getline(&line, &size, stdin); 
    printf("2");
    printf("%s\n", line); 
    }
return 0;
}
4

3 に答える 3

10

ここには、何も(実際にはゴミ)を指していないポインタがあります。

char* line;

getline()のマニュアルページから:

* lineptrがNULLの場合、getline()は行を格納するためのバッファーを割り当てます。これは、ユーザー・プログラムによって解放される必要があります。(この場合、* nの値は無視されます。)

または、getline()を呼び出す前に、* lineptrにmalloc(3)に割り当てられた*nバイトのサイズのバッファーへのポインターを含めることができます。バッファが行を保持するのに十分な大きさでない場合、getline()はrealloc(3)を使用してバッファのサイズを変更し、必要に応じて*lineptrと*nを更新します。

いずれの場合も、呼び出しが成功すると、*lineptrと*nが更新され、それぞれバッファーアドレスと割り当てられたサイズが反映されます。

したがって、 getlineにスタック割り当てバッファを使用できないことに注意してください。

これを行う簡単な方法は、lineNULLに初期化してgetline、割り当てを処理させることです。

char* line = NULL;
int size = 0;
getline(&line, &size, stdin);   // line and size are updated with buffer addr and size.
//...
free(line);
于 2012-06-25T22:33:25.080 に答える
5

次のメモリを割り当てていません。

char* line;

line有効なオブジェクトを指す前の無効なポインタです。mallocメモリを割り当てるために使用します。例:line = malloc(size);

于 2012-06-25T22:32:00.667 に答える
1
char* line = malloc(size * sizeof(char));

必要がなくなったら、メモリを解放することを忘れないでください。

free(line);
于 2012-06-25T22:32:58.630 に答える