我对C有点陌生,在做一个项目时遇到了一个我很想理解的奇怪行为。(可能是我错过了什么(。
我有以下结构:
typedef struct {
char *name;
int status;
int strength;
} Pig;
typedef struct {
char *name;
char color[10];
int injuryPower;
int penType;
} Bird;
当我像这样分配清管器时,它正常工作:
Pig *pig_1 = malloc(sizeof(Pig *));
pig_1->status = 2;
pig_1->strength = 7;
pig_1->name = malloc(sizeof(char) * 11);
pig_1->name = "PigA ";
但当我以类似的方式分配鸟时,我会有这种奇怪的行为:
Bird *bird_1 = malloc(sizeof(Bird *));
1) bird_1->penType = 2;
2) bird_1->injuryPower = 5;
3) bird_1->name = malloc(sizeof(char) * 6);
bird_1->name = "BirdA ";
bird_1->color[0] = 'R';
bird_1->color[1] = 'e';
bird_1->color[2] = 'd';
bird_1->color[3] = ' ';
在第(1(行中,笔类型被定义为2。
第(2(行中的笔类型仍然是2。
第(3(行中,笔类型根据我在bracets中定义的值进行更改,因此在本例中,它将更改为35。
我使用Cygwin 64位作为我的编译器。
有人能解释一下我在这里遗漏了什么吗?为什么笔类型的值在变化,尽管我没有改变它?
是因为malloc吗?我是不是做错了什么?
非常感谢!
Pig *pig_1 = malloc(sizeof(Pig *));
...
Bird *bird_1 = malloc(sizeof(Bird *));
您分配的是指针的大小,而不是结构的大小。
Pig *pig_1 = malloc(sizeof(Pig));
...
Bird *bird_1 = malloc(sizeof(Bird));
将为整个结构预留足够的空间。
因为您只为结构的第一个成员(也是指针(分配了足够的内存,所以其他成员位于可以为其他变量保留的内存区域中。你看到的是另一个变量的值正在改变,并反映在你的结构中。