我正在尝试在C中制作链接列表以更好地理解这个概念。为了使它更有趣,我让每个对象都有自己的随机字符串,由0x41 + (rand() % 26)
生成四次。
但是,当我运行程序时,字符串是空白的。
$ gcc ll.c && ./a.out
ID #0 = Master
ID #1 =
ID #2 =
...
ID #100 =
好的,让我们在gdb中运行它。
$ gcc -g ll.c && gdb ./a.out
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
...
(gdb) run
Starting program: /home/braden/code/test/c/linked-list/a.out
object 55 is:
ID #0 = Master
ID #1 =
...
ID #10 =
[Inferior 1 (process 10033) exited normally]
(gdb) break main
Breakpoint 1 at 0x4008c8: file ll.c, line 73.
(gdb) run
Starting program: /home/braden/code/test/c/linked-list/a.out
Breakpoint 1, main () at ll.c:73
73 srand(time(0));
(gdb) n
...
78 s = randstr2();
(gdb) n
79 push_thing(new_thing(s));
(gdb) print s
$1 = 0x602030 "MTBH"
(gdb) n
80 free(s);
(gdb) n
77 while(i--){
(gdb) n
78 s = randstr2();
(gdb) n
79 push_thing(new_thing(s));
(gdb) print s
$2 = 0x602030 "CWRP"
当我单步执行它时,它可以正常工作,因此无法通过常规方法调试此处发生的事情。根据gdb和valgrind的说法,我没有犯任何错误。
此外,我似乎无法在其他地方重现它。例如,将print语句放在创建对象的循环中。它会打印出正确的字符串。但是当我稍后在上引用它们时,它们是空白的。
等一下......
答案 0 :(得分:0)
我发现了问题
while(i--){
s = randstr2();
printf("s set to %s\n", s);
temp = new_thing(s);
printf("temp->str set to %s\n", s);
push_thing(temp);
free(s);
// ^^^^
}
在我试图确保一切都被释放的过程中,我忘记了什么"免费"显然意味着。
该块在被存储后被擦除释放,因此当稍后引用该块时,将无法再访问该内存。我相信它被称为悬挂指针。
可能是我最近犯过的更为愚蠢/明显的错误之一。