2

假设我有一个表示 PDF 文档pdf的结构和一个表示其中一个页面的结构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_pageandlast_page成员。)pdf

我的问题:如果我在调用 mydoc->first_page之后访问 - 以及链表中的其他页面 -是否有可能因为“将局部变量从其上下文中取出”而出现分段错误?create_pdf_file()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 回答