malloc导致int更改值

malloc导致int更改值,c,malloc,heap-memory,C,Malloc,Heap Memory,我对C有点陌生,在一个项目中,我遇到了一个奇怪的行为,我很想理解。(可能是我遗漏了什么) 我有以下结构: typedef struct { char *name; int status; int strength; } Pig; typedef struct { char *name; char color[10]; int injuryPower; int penType; } Bird; 当我分配清管器时,如下图所示,它正常工作:

我对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位作为我的编译器

有人能解释一下我在这里遗漏了什么吗?为什么笔型的价值在改变,即使我没有改变它

是因为马洛克吗?我做错什么了吗

非常感谢

Pig *pig_1 = malloc(sizeof(Pig *));
...
Bird *bird_1 = malloc(sizeof(Bird *));
您分配的是指针的大小,而不是结构的大小

Pig *pig_1 = malloc(sizeof(Pig));
...
Bird *bird_1 = malloc(sizeof(Bird));
将为整个结构保留足够的空间

Pig *pig_1 = malloc(sizeof(Pig));
...
Bird *bird_1 = malloc(sizeof(Bird));
因为您只为结构的第一个成员(也是指针)分配了足够的内存,所以其他成员位于可以为其他变量保留的内存区域中。你所看到的是另一个变量的值被改变并反映在你的结构中

Pig *pig_1 = malloc(sizeof(Pig));
...
Bird *bird_1 = malloc(sizeof(Bird));
您分配的是指针的大小,而不是结构的大小

Pig *pig_1 = malloc(sizeof(Pig));
...
Bird *bird_1 = malloc(sizeof(Bird));
将为整个结构保留足够的空间

Pig *pig_1 = malloc(sizeof(Pig));
...
Bird *bird_1 = malloc(sizeof(Bird));

因为您只为结构的第一个成员(也是指针)分配了足够的内存,所以其他成员位于可以为其他变量保留的内存区域中。您看到的是另一个变量的值被更改并反映在您的结构中。

malloc导致int更改值-nope。不会发生。
Pig*Pig_1=malloc(sizeof(Pig*)
是指向清管器的指针的大小。sizeof(Pig)是PigIn行的isze(3)笔类型根据我在大括号中定义的值进行更改,因此在本例中它将更改为35你如何确定?35岁的孩子应该来自哪里@箭鱼显然不是马洛克引起的,我只是太新了,不知道是什么引起的。我之所以确定这一点,是因为代码中进一步使用了pentype的值,并且由于值的变化,它“弄乱”了程序的其余部分。我使用IDE中的调试功能来检查这一点,并在第一次执行malloc时看到值的变化。在
Pig*Pig_1=malloc(sizeof(Pig*))之后
您有一个指向
清管器的指针,名为
清管器1
,它指向一些足够大的内存,可以容纳指向
清管器的指针。不多不少。您所做的一切都是未定义的行为,因为没有
Pig
,只有指向
Pig
的指针。malloc导致int更改值-nope。不会发生。
Pig*Pig_1=malloc(sizeof(Pig*)
是指向清管器的指针的大小。sizeof(Pig)是PigIn行的isze(3)笔类型根据我在大括号中定义的值进行更改,因此在本例中它将更改为35你如何确定?35岁的孩子应该来自哪里@箭鱼显然不是马洛克引起的,我只是太新了,不知道是什么引起的。我之所以确定这一点,是因为代码中进一步使用了pentype的值,并且由于值的变化,它“弄乱”了程序的其余部分。我使用IDE中的调试功能来检查这一点,并在第一次执行malloc时看到值的变化。在
Pig*Pig_1=malloc(sizeof(Pig*))之后
您有一个指向
清管器的指针,名为
清管器1
,它指向一些足够大的内存,可以容纳指向
清管器的指针。不多不少。您所做的一切都是未定义的行为,因为没有
Pig
,只有指向
Pig
的指针。我刚刚测试过,您是对的。谢谢我将在几分钟内(一旦它允许我)将此标记为答案。还是有点新,最近刚刚掌握了堆栈和堆的窍门,现在也在尝试合并结构。再次感谢!我刚刚测试过,你是对的。谢谢我将在几分钟内(一旦它允许我)将此标记为答案。还是有点新,最近刚刚掌握了堆栈和堆的窍门,现在也在尝试合并结构。再次感谢!
Pig *pig_1 = malloc(sizeof(Pig));
...
Bird *bird_1 = malloc(sizeof(Bird));