免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3985 | 回复: 11
打印 上一主题 下一主题

请教: calloc 貌似分配了栈地址的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-23 17:30 |只看该作者 |倒序浏览
在多线程程序中使用了calloc
char **dstr
dstr[cnt] = calloc(1,len);

结果运行中出现signal 11

gdb 调试发现 calloc 貌似返回了一个栈地址

#0  0x003c4b6c in _int_malloc () from /lib/libc.so.6
#1  0x003c60be in calloc () from /lib/libc.so.6
#2  0x08089e29 in get_args (rstr=0xb7ba5ffc "54$1$2$14528$303$282$1$", dstr=0xb7ba3f40, num_limit=7, str_limit=11)
    at gamework/deal_data.c:497
#3  0x0806ad08 in move_troop (s=145, buff=0xb7ba5ffc "54$1$2$14528$303$282$1$") at gamework/war_deal.c:3241
#4  0x0808a89b in real_deal (s=145) at gamework/deal_data.c:706
#5  0x0808a99b in real_deal (s=145) at gamework/deal_data.c:756
#6  0x0808bb98 in do_accept (s=145) at function.c:463
#7  0x004d549b in start_thread () from /lib/libpthread.so.0
#8  0x0042c42e in clone () from /lib/libc.so.6
(gdb) f 4
#4  0x0808a89b in real_deal (s=145) at gamework/deal_data.c:706
706                 if (cmd > MAX_FUNC_NUM )
(gdb) p &cmdstr
$15 = (char (*)[4]) 0xb7ba3ff4
(gdb) f 2
#2  0x08089e29 in get_args (rstr=0xb7ba5ffc "54$1$2$14528$303$282$1$", dstr=0xb7ba3f40, num_limit=7, str_limit=11)
    at gamework/deal_data.c:497
497                     if (!(rstr == SPACE))
(gdb) p dstr[cnt]
$16 = 0xb7ba3ff4 "235""


dstr[cnt]  &cmdstr 地址居然一样,有谁能赐教一下?

论坛徽章:
0
2 [报告]
发表于 2010-05-23 19:32 |只看该作者
dstr的数组空间分配了没?你得先给dstr指针数组分配空间,然后才能用dstr[cnt]这种形式。

论坛徽章:
0
3 [报告]
发表于 2010-05-23 20:41 |只看该作者
本帖最后由 孙轩 于 2010-05-23 20:44 编辑

int move_troop(int s, char *buff)
{
        char *strings[7],buff2[1024];

就是运行时分配的 dstr[cnt] = calloc(1,len); 这里出错的

论坛徽章:
0
4 [报告]
发表于 2010-05-23 20:47 |只看该作者
dstr = (char**) malloc(sizeof(char*)*(cnt+1));
dstr[cnt] = calloc(1,len);
如果你缺少第一行的话。signal 11

论坛徽章:
0
5 [报告]
发表于 2010-05-24 16:06 |只看该作者
本帖最后由 孙轩 于 2010-05-24 16:10 编辑

当然申明过了
char *strings[7] ;
strings 就是dstr,
cnt 当时等于6 也就是最后一个
这个程序跑起来是可以的,出现signal 11是偶然的

论坛徽章:
0
6 [报告]
发表于 2010-05-25 15:57 |只看该作者
有人能赐教下么?或着分析是什么问题?

论坛徽章:
0
7 [报告]
发表于 2010-05-25 17:01 |只看该作者
信息太少,而且帖子太难看

论坛徽章:
0
8 [报告]
发表于 2010-05-25 18:44 |只看该作者
你那个strings[]是栈里面分配的啊,拿来存放calloc()分配的东西,离开声明范围指针就无效了。注意我的例子是用的malloc分配的指针数组。
你的代码太少,说明也不清楚,只有你自己才知道什么意思。

论坛徽章:
0
9 [报告]
发表于 2010-05-26 09:15 |只看该作者
有人能赐教下么?或着分析是什么问题?
孙轩 发表于 2010-05-25 15:57



    不会是calloc的问题。因为出问题的时候才_init_malloc,还没有真正分配,因此dstr[6]里面的是遗留下来的值。
我猜应该是内存操作破坏了堆的结构,你能否打印各个栈层次的栈指针出来?或贴一部分关键性的代码?

论坛徽章:
0
10 [报告]
发表于 2010-05-26 09:18 |只看该作者
特别是dstr前面几项是怎么分配空间的?分配之后怎么存放数据的?我看好像有一个11的限长,是不是存放的时候越界了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP