指向其声明范围之外的局部变量的指针
假设我有一个表示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; } }
(这只是一个示例源代码,因此不显示列表处理。显然,需要先设置pdf
的first_page
和last_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
内存。