我目前正在为我的编程课程开发一个游戏项目,我偶然发现了一个看起来超出我能力甚至开始理解的错误。 此错误会影响链接节点的列表结构,如下所示:
struct node{
struct position pos;
struct node *next ;
};
struct list_pos{
struct node *head ;
struct node *tail ;
struct node *cursor ;
int length ;
};
我的问题发生在我的程序开始一段时间后,通过在读取我的列表的函数上发出分段错误信号。
分段错误来自于我的程序试图在组成我的列表的最后一个节点上访问地址0x10的事实,当它应该让它的下一个元素为NULL时。 使用gdb,我在整个程序的执行过程中跟踪了我的列表的演变,我发现它是一个SDL函数,通过malloc,修改我的列表最后一个节点*下一个指针从0x0到0x10。
我不知道这是否来自于我的部分滥用堆,或者它是否真的是SDL库的错误但我真的很感激有人可以告诉我这里发生了什么。
以下是导致我发现此错误的gdb会话:
(gdb) p joueurs[0].lp->tail
$9 = (struct node *) 0x8093318
(gdb) p joueurs[0].lp->tail->next
$10 = (struct node *) 0x0
(gdb) watch joueurs[0].lp->last->next
Hardware watchpoint 3: joueurs[0].lp->last->next
(gdb) c
Continuing.
Hardware watchpoint 3: joueurs[0].lp->last->next
Old value = (struct node *) 0x0
New value = (struct node *) 0x10
malloc_consolidate (av=<optimized out>) at malloc.c:5183
5183 malloc.c: Aucun fichier ou dossier de ce type.
(gdb) bt
#0 malloc_consolidate (av=<optimized out>) at malloc.c:5183
#1 0xb7e08475 in _int_malloc (av=<optimized out>, bytes=<optimized out>) at malloc.c:4373
#2 0xb7e0a8ec in *__GI___libc_malloc (bytes=1920000) at malloc.c:3660
#3 0xb7f4ebfe in SDL_CreateRGBSurface () from /usr/lib/i386-linux-gnu/libSDL-1.2.so.0
#4 0x08048cd6 in refresh (screen=0x8079d98, aff_carte=0x8079888, carte=0x8079850, joueurs=0xbffff82c, nb_joueurs=1) at jeux.c:23
#5 0x08049139 in new_game (screen=0x8079d98, carte=0x8079850) at jeux.c:120
#6 0x080491db in main (argc=1, argv=0xbffff964) at jeux.c:138