2

PDF ドキュメントpdfを表す構造と、そのページの 1 つを表す構造があるとしますpdf_page

typedef struct pdf_page {
    int page_no;
    pdf_page *next_page;
    char *content;
} pdf_page;

typedef struct {
    pdf_page *first_page, *last_page;
} pdf;

私の から、私main()は を呼び出しますcreate_pdf_file(pdf *doc):

void main() {
  pdf doc;
  create_pdf_file(&doc);
  // reading the linked list of pages here
}

create_pdf_fileそれがこれらの線に沿ったものであると仮定します:

void
create_pdf_file(pdf *doc) {
    for (int i = 0; i < 10; i++) {
        pdf_page p;
        p.page_no = i;
        p.contents = "Hello, World!";
        doc->last_page->next_page = p;
    }
}

(これはソース コードの例にすぎないため、リスト処理は示されていません。明らかに、first_pagelast_pageのメンバーをpdf最初に設定する必要があります。)

私の質問:doc->first_pageリンクされたリスト内の他のページと同様にcreate_pdf_file()、 my で呼び出した後にアクセスすると、「ローカル変数をそのコンテキストから取り出すmain()」ためにセグメンテーション違反が発生する可能性はありますか?p

(対応するメモリ位置が他の目的で使用されないことを保証したかどうかはわかりません。)

もしそうなら、どうすればこれを回避できますか?

ありがとう。

4

2 に答える 2

2

はい、p はスタックに格納されたローカル変数であり、有効期間が終了すると (すべてのループ反復)、それへのポインターは無効になります。終了したら、すべてのページを malloc() および free() で割り当てる必要があります。これは次のようになります。

for (int i = 0; i < 10; i++) 
{
        pdf_page* p = malloc(sizeof(pdf_page));
        p->page_no = i;
        p->contents = "Hello, World!";
        doc->last_page->next_page = p;
}

関数を呼び出すときは、doc へのポインターを渡す必要があります。

create_pdf_file(&doc);
于 2013-08-27T19:28:09.607 に答える
1

「ローカル変数 p をそのコンテキストから取り出す」ためにセグメンテーション違反が発生する可能性はありますか?

宣言されたブロックpが終了すると、ポインタpは無効になり (「ダングリング ポインタ」)、そのようなポインタを逆参照しようとすると、未定義の動作になります。つまり、そうしないでください。セグメンテーション違反やその他の動作 (ランダムなメモリの破損やエラー状態のない間違ったデータの使用など) が発生する可能性があります。

(対応するメモリ位置が他の目的で使用されないことを保証したかどうかはわかりません。)

pの寿命がへのポインターよりも短いことを保証しましたp

もしそうなら、どうすればこれを回避できますか?

mallocデータを保持するために正しいサイズのメモリ領域を動的に割り当てるために使用します。free必要がなくなったときは、思い出を忘れないでください。

于 2013-08-27T19:24:36.817 に答える