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

假设我有一个表示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 last_page->next_page = p; } } 

(这只是一个示例源代码,因此不显示列表处理。显然,需要先设置pdffirst_pagelast_page成员。)

我的问题:如果我在main()调用create_pdf_file()之后访问doc->first_page以及链表中的其他页面,是否可能因为“获取局部变量p而出现分段错误”脱离其背景“?

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

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

谢谢。

是的,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); 

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

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

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

你已经保证p的生命周期短于指向p的指针。

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

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