当我更改与其相关的结构时,内存分配不起作用
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;
我目前正在使用一个结构
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;