【发布时间】: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的值(使用%pprintf 说明符),重新编译并重新运行代码。如果在您出现段错误时 gdb 打印的值不同,那么您将 100% 确定您正在直接或间接地在代码中修改该变量 somewhere。