c语言 - 当我更改与之相关的结构时,内存分配不起作用



我目前正在使用一个结构

struct Player{
Object obj;
int touched;
};
typedef struct Player *Player;

这是从这个结构中创建的一个元素:

Player createPlayer(int posiX,int posiY){
Player p;
p=malloc(sizeof(p));
p->obj.posi.x=posiX;
p->obj.posi.y=posiY;
p->obj.life=100;
p->touched=0;
p->obj.damage=5;
p->obj.friend=true;
return p;
}

像这样,每次编译都很完美。但如果我的结构中有两个元素,

struct Player{
Object obj;
int touched;
int frequency;
int lastTouch;
};
typedef struct Player *Player;

我在执行时收到了这个错误消息(代码编译得很完美(:

malloc((:无效大小(未排序(中止(堆芯转储(

我不明白为什么我会收到这个错误消息,因为我还没有使用这两个新变量。

与其将Player定义为指针,不如按原样定义

struct Player{
Object obj;
int touched;
};
typedef struct Player Player_t;

然后这样做:

Player_t *createPlayer(int posiX,int posiY){
Player_t *p = malloc(sizeof(Player_t));
p->obj.posi.x=posiX;
p->obj.posi.y=posiY;
p->obj.life=100;
p->touched=0;
p->obj.damage=5;
p->obj.friend=true;
return p;
}

顺便说一句:typedef指针从来都不是一个好主意,因为你永远无法从它的名称或其他地方的声明中知道它是否是一个指针。你至少应该明确地说,它是这样一个指针:

typedef struct Player *PlayerPtr;

typedef struct Player *Player_p;

在线上

p=malloc(sizeof(p));

您只为一个指针进行分配,而需要为整个结构进行分配。

你应该做:

p=malloc(sizeof *p);

添加*以取消引用指针并获取结构类型。

不建议使用typedef来模糊像typedef struct Player *Player;这样的指针,因为它可能会导致这种类型的混淆。

最新更新