我对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\0";
但是当我以类似的方式分配鸟时,我有这种奇怪的行为:
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\0";
bird_1->color[0] = 'R';
bird_1->color[1] = 'e';
bird_1->color[2] = 'd';
bird_1->color[3] = '\0';
在第(1)行中,笔的类型定义为2。
第(2)行中的笔类型仍为2。
在第(3)行中,笔类型根据我在bracets中定义的值而更改,因此在本示例中,它将更改为35。
我正在使用Cygwin 64位作为编译器。
有人可以解释一下我在这里缺少什么吗?即使我没有改变笔型,为什么笔型的价值也在改变?
是因为malloc吗?我做错了什么吗?
非常感谢!
答案 0 :(得分:2)
Pig *pig_1 = malloc(sizeof(Pig *));
...
Bird *bird_1 = malloc(sizeof(Bird *));
您要分配的是指针的大小,而不是结构的大小。
Pig *pig_1 = malloc(sizeof(Pig));
...
Bird *bird_1 = malloc(sizeof(Bird));
将为整个结构保留足够的空间。
因为只为结构的第一个成员(也就是指针)分配了足够的内存,所以其他成员位于可以保留给其他变量的内存区域中。您将看到的是另一个变量的值正在更改并反映在您的结构中。