【发布时间】:2019-05-06 07:41:39
【问题描述】:
我对 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) 行中,笔类型根据我在括号中定义的值进行更改,因此在此示例中它将更改为 35。
我使用 Cygwin 64 位作为我的编译器。
有人可以解释一下我在这里缺少什么吗,为什么即使我没有更改笔类型的值也会改变它?
是因为malloc吗?我做错了什么吗?
非常感谢!
【问题讨论】:
-
malloc 导致 int 改变值 - 不。不会发生。
-
Pig *pig_1 = malloc(sizeof(Pig *));是指向 Pig 的指针的大小。 sizeof(Pig) 是猪的大小 -
在第 (3) 行中,根据我在括号中定义的值更改了笔类型,因此在本例中它将更改为 35。 – 你如何确定那? 35应该从哪里来? Tom Lehrer - Poisoning Pigeons in the Park
-
@Swordfish 显然 malloc 并没有导致这种情况,我只是太新了,无法理解是什么原因造成的。我确定这是因为在代码中进一步使用了 pentype 的值,并且由于值的变化它“搞砸”了程序的其余部分。我使用 IDE 中的调试功能来检查这一点,并在我执行的第一个 malloc 时查看值的变化。
-
是的,你搞砸了。在
Pig *pig_1 = malloc(sizeof(Pig *));之后,您有一个指向Pig的指针,称为pig_1,它指向的内存足够大,可以容纳指向Pig的指针。不多也不少。你所做的一切都是未定义的行为,因为没有Pig,只有指向Pig的指针。
标签: c malloc heap-memory