C-c 设计模式
a->p->attack=trans;这句错误为什么
#include<stdio.h>
#include<stdlib.h>
typedef struct player
{
void (*attack)(void *);
}player;
player *creatplay()
{
player *p=(player *)malloc(sizeof(player));
if(p==NULL)
return NULL;
return p;
}
typedef struct foreign
{
void (*jingong)();
}foreign;
void jingong()
{
printf("进攻");
}
foreign *creatforeign()
{
foreign *f=(foreign *)malloc(sizeof(foreign));
if(f==NULL)
return NULL;
f->jingong=jingong;
return f;
}
typedef struct adapter
{
player *p;
foreign *f;
}adapter;
void trans(void *padapter)
{
((adapter *)padapter)->f->jingong();
}
adapter *creat()
{
adapter *a=(adapter *)creatplay();
a->f=creatforeign();
a->p->attack=trans;
return a;
}
int main()
{
player *p=(player *)creat();
p->attack(p);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
a->p->attack=trans;
这句话的意思是 把 trans的地址给a->p-attack,
a->p-attack是一个不带入参的函数,
trans带入参 *padapter,二者不匹配,所以报错
这段程序很有意思, 具体问题就是 a->p 没有初始化. 下面具体看看.
为了方便, 把creat函数稍改了一下, 加入p指针
gdb可见:
player *p在堆中分到一段内存0x601010, 然后被a占用了;
本来是要放入p->attack的, 但现在要放入的是a->p;而a->p->attack是说, 先拿a->p(指针), 为0, 然后从地址0x0处去取a->p->attack; 这个地址不能访问. 程序罢工了.
那么我们把a->p初始化一下:
可以向下走了, 接着在main里报SF:
这里可以看到, main里现在的这个p实际上应该是一个指针的指针... 改一下:
嗯, 函数trans里报SF了... 不改了, 呵呵.顺便问一下, lz这个程序是参考了什么写的啊.
gcc version 4.6.2 (SUSE Linux) 编译你贴出来的代码,没有问题。
不过会coredump,你指的有问题是这个吧?
Program terminated with signal 11, Segmentation fault.
#0 0x000000000040065a in creat () at test.c:51
51 a->p->attack=trans;
(gdb) bt
#0 0x000000000040065a in creat () at test.c:51
#1 0x0000000000400679 in main () at test.c:57
(gdb) p trans
$1 = {void (void *)} 0x40060b <trans>
(gdb) p a
$2 = (adapter *) 0x602010
(gdb) p *a
$3 = {p = 0x0, f = 0x602030}
(gdb)
core的原因是,p是一个空指针。
希望可以帮助到你。