当我更改与其相关的结构时,内存分配不起作用

Memory allocation doesn't work when I change the structure related to it

我目前正在使用一个结构

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;
}

这样每次都能完美编译。 但是如果我的结构中有 2 个元素,

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

我在执行时收到此错误消息(代码编译完美):

malloc(): 大小无效(未排序) 已中止(核心已转储)

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

p=malloc(sizeof(p));

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

你应该做的:

p=malloc(sizeof *p);

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

不推荐使用 typedef 来掩盖像 typedef struct Player *Player; 这样的指针,因为它会导致这种类型的混淆。

与其将 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;