访问struct GDB错误指针时无法访问内存

时间:2011-10-07 10:20:17

标签: c gdb

我运行了gdb,因为我的代码显示了segfault。我理解提供错误的代码是

210         if (colour_s->colorlist.colorlist_id == 1)
(gdb) print colour_s
$1 = (car_colour_list_t_slot *) 0x21
(gdb) print colorlist
$2 = (car_colour_list_t *) 0x12d1a80
(gdb) print colour_s->colorlist
Cannot access memory at address 0x21

typedef struct {
    int colorlist_id;
} car_colour_list_t;


typedef struct _car_colour_list_t_slot {
    car_colour_list_t colorlist;
    struct _car_colour_list_t_slot *next, *prev;
} car_colour_list_t_slot;


car_colour_list_t_slot *colour_s;
colour_s = (car_colour_list_t_slot *)malloc(sizeof(car_colour_list_t_slot));
car_colour_list_t *colorlist;
colorlist = (car_colour_list_t *)malloc(sizeof(car_colour_list_t));

我已经分配了那些指针内存,但是当我尝试打印colour_s-> colorlist时它失败了(无法访问地址0x21的内存)

虽然我已经为每个poitner分配了内存,但有人能理解为什么会这样吗?

谢谢

1 个答案:

答案 0 :(得分:1)

colour_s指针肯定无效。毫无疑问。 GDB只是告诉你这个事实。 (0x0附近的任何指针都是无效的,任何带有模4余数的指针对于你的结构都是无效的。)malloc函数将从不返回0x21。

您的计划有很多方法可以做到这一点。它们归结为程序中两种基本类型的错误:

  • colour_s未初始化。
  • colour_s已初始化,但它被代码的其他部分中的错误意外覆盖。
  • GDB或编译器中存在错误(不值得考虑)

使用Valgrind运行程序或在colour_s上设置观察点。这些将帮助您发现代码中的错误位置。

作为替代练习,只需阅读代码即可查看是否可以找到错误,而无需运行它。仔细读。这种练习会让你成为更好的程序员。