malloc'结构*中的char *以某种方式显示为空白

时间:2015-10-08 04:22:43

标签: c memory-management random gdb heisenbug

我正在尝试在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语句放在创建对象的循环中。它会打印出正确的字符串。但是当我稍后在上引用它们时,它们是空白的。

等一下......

1 个答案:

答案 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);
//  ^^^^
}

在我试图确保一切都被释放的过程中,我忘记了什么"免费"显然意味着。

该块在被存储后被擦除释放,因此当稍后引用该块时,将无法再访问该内存。我相信它被称为悬挂指针。

可能是我最近犯过的更为愚蠢/明显的错误之一。