【问题标题】:Segmentation fault when reading data from LibreDWG pointer to pointer structures with C使用 C 从 LibreDWG 指针读取数据到指针结构时出现分段错误
【发布时间】: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 将其存储在临时内存空间中,但问题仍然相同。第一次阅读后,我得到了分段错误。
  • 您是否在调试器中查看过dwgdwg.object_ref[i]dwg.object_ref[i]-&gt;obj 等的值,看看它们是否有意义。像现在这样打印一个地址,如果该地址不包含您认为它包含的内容,则没有任何意义。
  • 请使用您正在使用的分配更新您的代码。
  • 我刚刚使用调试器发现了问题。感谢您的推荐!只是为了记录,问题出在分析的 .dwg 文件中,因为在列表的第二个元素中它有一个错误的地址 (0x00),这就是它一直停在同一个地方的原因。我假设该文件是正确制作的。再次感谢。

标签: c dwg libredwg


【解决方案1】:

我终于找到了问题所在。 它在分析的 .dwg 文件中,因为在列表的第二个元素中它有一个错误的地址 (0x00),这就是它一直停在同一个地方的原因。我假设该文件是正确制作的,但在其他一些文件中似乎是一个问题,因为我也尝试过使用不同的 dwg 文件,所以在尝试访问它之前,我会在地址值上添加一个条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多