假设我有一个代表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()
从其上下文中取出”,我可能会出现分段错误吗?
(我不确定我是否保证相应的内存位置不会用于其他内容。)
如果是这样,我该如何避免这种情况?
感谢。
答案 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
记忆。