【发布时间】:2018-07-27 09:50:05
【问题描述】:
我正在使用 LibreDWG 库处理 DWG 文件。
我成功打开了一个文件,并将所有数据放在一个包含许多不同字段的 dwg 结构中。
dwg 结构描述为here。
当我尝试从类型为 Dwg_Object_Ref ** 的 object_ref 打印数据时出现问题,我将值 num_object_refs 用于遍历 object_ref 数组,然后每个元素都包含 3 个字段 (see here)。我可以打印 te value absolute_ref,它是一个 long unsigned int,但是我需要从 obj 中获取一个值,它是一个指向 dwg_object structure 的指针。从 obj 我想获取值“index”,我的代码是:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "dwg.h"
int load_dwg(char *filename, unsigned int opts) {
unsigned int i;
int success;
Dwg_Data dwg;
memset(&dwg, 0, sizeof(Dwg_Data));
dwg.opts = opts;
success = dwg_read_file(filename, &dwg);
FILE *f = fopen("lines.txt", "w");
for (i = 0; i < dwg.num_object_refs; i++)
{
struct _dwg_object *object;
object = malloc(sizeof(struct _dwg_object));
object = dwg.object_ref[i][0].obj;
printf("%d\n", object->index);
}
fclose(f);
dwg_free(&dwg);
return success;}
int main (int argc, char *argv[])
{
int i = 1;
unsigned int opts = 1;
load_dwg (argv[i], opts);
return 0;
}
这会打印“index”的第一个值,然后出现分段错误。
210
Erreur de segmentation (core dumped)
但如果我更改 for 内的 printf 行以打印这样的地址:
printf("%p\n", &dwg.object_ref[i]->obj->index);
我可以毫无问题地获得所有地址。
谁能帮我理解这个问题的原因?
谢谢!
【问题讨论】:
-
编译时是否有 any 警告(打开所有警告标志(例如,
-Wall -Wextra至少用于 gcc,-Weverything用于 clang 等)?你有吗?试过通过 valgrind 运行它吗?你试过用调试器单步调试你的程序吗? -
您好,感谢您的回复!我尝试打开警告标志并且根本没有警告。然后我尝试使用 Valgrind,它显示了一个错误,即:地址 0x0 没有被堆栈、malloc 或(最近)释放。然后我 malloc'd 变量 obj 将其存储在临时内存空间中,但问题仍然相同。第一次阅读后,我得到了分段错误。
-
您是否在调试器中查看过
dwg、dwg.object_ref[i]、dwg.object_ref[i]->obj等的值,看看它们是否有意义。像现在这样打印一个地址,如果该地址不包含您认为它包含的内容,则没有任何意义。 -
请使用您正在使用的分配更新您的代码。
-
我刚刚使用调试器发现了问题。感谢您的推荐!只是为了记录,问题出在分析的 .dwg 文件中,因为在列表的第二个元素中它有一个错误的地址 (0x00),这就是它一直停在同一个地方的原因。我假设该文件是正确制作的。再次感谢。