先看gdb跟踪过程
Hardware watchpoint 3: pad_front
Old value = 4
New value = 15
breath_travel (pRoot=0x603030, pQueue=0x603010) at print_tree_final.c:206
206 if((qNode->blank == 1))
(gdb) n
228 if(pad_front == 0)
(gdb) n
235 char *old_buf=buf_branch;
(gdb) n
236 printf("%*s%*d%*s",pad_front*pad_num," ",pad_num,qNode->t_node->value,(1+pad_front)*pad_num," ");
(gdb) n
238 sprintf(new_buf,"%s","123");
(gdb) n
Hardware watchpoint 2: child_depth
Old value = 2
New value = 3355185
0x00007ffff7ade419 in memcpy () from /lib/libc.so.6
我很奇怪,为啥int child = 2的值会被sprintf语句改写,一直想不明白。搜索了下,发现new_buf没分配空间造成的,所以才会说memcpy内存复制错误,可能覆盖了其它数据区域。
我声明 new_buf方法是
char *new_buf;
改为
char *new_buf=(char*)malloc(100);
问题解决。怪不得数组初始化经常是
char buffer[1024];
这样的。应该是等同上面那句malloc语句。如果指针和数组没有初始化,就很可能覆盖了其它区域。