malloc заставляет int менять значение - PullRequest
0 голосов
/ 04 декабря 2018

Я немного новичок в 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?Я что-то делаю неправильно?

Большое спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018
Pig *pig_1 = malloc(sizeof(Pig *));
...
Bird *bird_1 = malloc(sizeof(Bird *));

Вы выделяете размер указателя, а не размер структуры.

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

Резервирует достаточно места для всей структуры.

Поскольку вы тольковыделяя достаточно памяти для первого члена вашей структуры (также указателя), остальные члены находятся в области памяти, которая может быть зарезервирована для других переменных.То, что вы видите, - это значение другой переменной, которая изменяется и отражается в вашей структуре.

...