指向其声明范围之外的局部变量的指针

时间:2013-08-27 19:18:35

标签: c memory

假设我有一个代表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_page的{​​{1}}和last_page成员需要先设置。)

我的问题:如果我访问pdf - 以及链接列表中的其他网页 - 在doc->first_page create_pdf_file()之后调用,则是由于“将局部变量main()从其上下文中取出”,我可能会出现分段错误吗?

(我不确定我是否保证相应的内存位置不会用于其他内容。)

如果是这样,我该如何避免这种情况?

感谢。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

  

是否有可能因为“将局部变量p从其上下文中取出”而出现分段错误?

一旦声明p的块终止,任何指向p的指针都无效(“悬空指针”)并尝试取消引用这样的指针是Undefined Behavior。换句话说,不要这样做:你可能会出现分段错误或任何其他行为(包括随机内存损坏或使用错误数据而没有任何错误条件。)

  

(我不确定我是否保证相应的内存位置不会用于其他内容。)

您已确保p的生命周期短于指向p的指针。

  

如果是这样,我该如何避免这种情况?

使用malloc动态分配正确大小的内存区域来保存数据。当你不再需要时,不要忘记free记忆。