0

ここに質問を投稿するのはこれが初めてです。似ているものを検索しましたが、見つかったものはありませんでした。

これが私のヘッダーのスニペットです:

#define LINE_LEN_MAX 256

typedef struct line_description {
    char buffer[LINE_LEN_MAX + 1];
    [...]
} line;

そして、これが私のメイン関数からのスニペットです:

int main(int argc, char *argv[]) {

    line *lineRead;

    //input: valid FILE *, read from cmdline
    //char buffer[LINE_LEN_MAX + 1];

    while(fgets(lineRead->buffer, LINE_LEN_MAX + 1, input) != NULL) {

        [...]

        memset(lineRead->buffer, 0, LINE_LEN_MAX + 1);
    }
}

セグメンテーション違反が発生し続けます。'memset()'行をコメントアウトすると、セグメンテーション違反が発生する前に、入力ファイルから正確に3行を読み取ることができます。

ただし、「lineRead->buffer」をローカルのchar[]に置き換えると、入力ファイルを完全に読み取ることができます。

ここで構造体について理解していないことは何ですか?私が欲しいと思うのは、構造体内のchar []の先頭へのポインターですが、明らかにこれは起こっていることではありません。

編集:申し訳ありませんが、指定するのを忘れました:ここでは動的メモリを使用していません。

4

3 に答える 3

2

lineReadプログラムには初期化されていないポインタがありますが、これはおそらくあなたが望んでいたものではありません。

line lineRead代わりにline、スタックに構造体を割り当てるなどのように記述して、行にストレージスペースを割り当てる必要があります。次に、そのメンバーにアクセスするの.ではなく、を使用します。->

于 2010-02-18T02:05:34.763 に答える
1

lineReadを指すように宣言しますlineが、実際には何も指すように設定しません。次に、初期化されていないポインタがたまたま指しているランダムな場所にアクセスしようとすると、セグメンテーション違反が発生します。

ローカルスコープでのみ必要な場合はlineRead、ポインタにする必要はありません。次のように宣言してください。

line lineRead;

関数lineReadよりも長持ちする必要があり、実際に動的に割り当てる必要がある場合は、ポインターを使用するだけでなく、ポインターが指す必要のある構造体用にメモリを予約します。

line *lineRead = malloc(sizeof(line));
lineRead->buffer[0] = '\0'; // or any other initializations...
于 2010-02-18T02:04:53.877 に答える
1

スニペットから何かを除外しただけなのに、割り当てられている構造を表示しなかった可能性があります。

line *lineRead; // uninitialized pointer: access to any field crashes
lineRead = (line*) malloc( sizeof( line_description ) );

または、ヒープ上にある必要がない場合(特に、の最も外側のスコープにあるスタックオブジェクトにmainは、プログラム全体の存続期間があることを考慮して)、

line lineRead; // don't need to use a pointer!
于 2010-02-18T02:05:16.907 に答える