在整理自己的工具库的时候忽然发现了这个问题!(linux系统)
我真的实在是不明白为什么了?有没有懂realloc的高手帮我分析一下问题,感激不尽,我这是第一次在博客园求助,有木有给力的高手呢
问题好像是出在realloc函数,根据tracestack最后追踪到了问题在/lib64/libc.so.6这个应该类似于windows下的dll吧?具体内部都是二进制码摸不透。
第一段代码是关于我的动态分配内存的栈的简单代码:
1 #ifndef C_STACK_H_INCLUDED 2 #define C_STACK_H_INCLUDED 3 4 #define ASSERT_MODE 5 #ifdef NO_ASSERT_MODE 6 #undef ASSERT_MODE 7 #endif 8 9 10 int size_stack=0; 11 int top_stack=0; 12 13 int*create_stack(int size){ 14 size_stack=size; 15 top_stack=0; 16 return (int*)malloc(sizeof(int)*size); 17 } 18 19 void destroy_stack(int*stack){ 20 top_stack=0; 21 size_stack=0; 22 free(stack); 23 stack=NULL; 24 } 25 26 void insert_stack(int**stack,int v){ 27 (*stack)[top_stack++]=v; 28 if(top_stack==size_stack){ 29 size_stack*=2; 30 *stack=(int*)realloc(*stack,size_stack); 31 } 32 } 33 34 int remove_stack(int**stack){ 35 #ifdef ASSERT_MODE 36 assert(top_stack>=0); 37 #endif 38 int tmp=(*stack)[--top_stack]; 39 return tmp; 40 } 41 42 #endif // C_STACK_H_INCLUDED
第二段代码是main函数入口:(跑这段代码会在最后一个insert_stack崩掉)
1 int*s=create_stack(1); 2 insert_stack(&s,1); 3 insert_stack(&s,2); 4 insert_stack(&s,3); 5 insert_stack(&s,4); 6 insert_stack(&s,5); 7 insert_stack(&s,6); 8 insert_stack(&s,7); 9 insert_stack(&s,8); 10 remove_stack(&s); 11 remove_stack(&s); 12 remove_stack(&s); 13 remove_stack(&s); 14 remove_stack(&s);
求解释一下原因~~~
追加:不要跟我说改成malloc和memcpy的形式...不要太无脑
请仔细对比下你写的这两条语句:
malloc(sizeof(int)*size) 和 realloc(*stack,size_stack)
如果让你改成 malloc 和 memcpy 的话,你要是有脑的话应该能立即看出问题来。
好的 是我无脑 这个问题竟然能困扰我一晚上
不行呀 我把参数改成了size_stack*sizeof(int)竟然还是会崩掉,大神再帮我看下好吗?
@guguli: 你是说还是在最后一个insert_stack崩掉吗?
@Launcher: 对对对,你试一试看看怎么样?这个问题看起来很基础,但是很缠人呀 搞不懂!!虚心求教!
@Launcher: Debug到了最后一个INSERT—STACK参数监视的时候还是8*4应该是正确的呀
@guguli: 我测试了下,没有问题。
怎么不检查一下realloc是否返回NULL?