【问题标题】:malloc causes int to change valuemalloc 导致 int 改变值
【发布时间】: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


【解决方案1】:
Pig *pig_1 = malloc(sizeof(Pig *));
...
Bird *bird_1 = malloc(sizeof(Bird *));

您分配的是指针的大小而不是结构的大小。

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

将为整个结构保留足够的空间。

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

【讨论】:

  • 我刚刚测试过,你是对的。谢谢!我会在几分钟内将此标记为答案(一旦它允许我)。仍然有点新,最近才掌握了堆栈和堆的窍门,现在也尝试合并结构。再次感谢!
猜你喜欢
  • 2013-02-19
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多