【问题标题】:can not access memory when accessing pointer to a struct GDB error访问指向结构 GDB 错误的指针时无法访问内存
【发布时间】:2011-12-02 21:50:36
【问题描述】:

我已经运行了 gdb,因为我的代码显示了段错误。我知道给出错误的代码是

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 分配了内存?

谢谢

【问题讨论】:

  • 您肯定会在代码中的其他地方直接或间接覆盖color_s
  • 我将它分配给一个函数,释放 colour_s 指针,并使用套接字,这个值遍历到其他函数(所以这个值发生了很多事情)。我只需要在我的函数中“撤销”这个值。
  • 我们无法真正猜出您做错了什么。你显示的线条没问题。所以你的错误在别处。
  • @Mat :问题是我没有在我的函数中使用这个 colour_s 指向结构的指针。它之前可能被其他功能使用过(它在远程服务器中,也许它没有被释放或其他东西)。那么我怎样才能再次使用这个指向这个结构的指针呢?我试图将此指针设置为 NULL,但仍然没有帮助
  • 在 malloc 之后打印color_s 的值(使用%p printf 说明符),重新编译并重新运行代码。如果在您出现段错误时 gdb 打印的值不同,那么您将 100% 确定您正在直接或间接地在代码中修改该变量 somewhere

标签: c gdb


【解决方案1】:

colour_s 指针绝对无效。 毫无疑问。 GDB 只是将这一事实告知您。 (任何接近 0x0 的指针都是无效的,任何以 4 为余数的指针对于您的结构都是无效的。)malloc 函数将永远返回 0x21。

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

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

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

作为一个替代练习,看看您是否可以通过阅读代码而不运行它来找到错误。仔细阅读。这种练习会让你成为一个更好的程序员。

【讨论】:

  • 我已经为指针分配了内存,而且我确信在我的代码中,我根本没有分配这个变量..
  • @heike:如果您确定它已初始化,那么唯一的另一种可能性是您的程序在初始化后更改了值。如果指针使用不正确,则可能通过指向不相关变量的指针发生这种情况。这是 C 语言中常见的错误类型。正如我所说,设置观察点或运行 Valgrind。
猜你喜欢
  • 2015-05-14
  • 2017-01-04
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2017-07-18
相关资源
最近更新 更多