【问题标题】:C program crashes when I tried to set an element of type char* in my struct to a specific string?当我尝试将结构中的 char* 类型的元素设置为特定字符串时,C 程序崩溃?
【发布时间】:2015-06-05 06:21:20
【问题描述】:

我的 C 程序有一个奇怪的问题。我正在尝试跟踪我在我的小游戏中创建的武器的名称和奖励,但是,在初始化几个武器后程序崩溃了。

这是我的武器结构:

typedef struct weaponTag {
    char *name;
    int bonus;
} weaponNode;

在这里我为 6 种不同的武器分配了足够的内存:

weaponNode *wep = malloc(sizeof(weaponNode) * 6);
initializeWeapons(&wep);

initializeWeapons 使用之前创建的wep 的地址调用:

void initializeWeapons(weaponNode **wep)
{
    printf("Initializing weapons...\n");
    setWeapon(wep[0], "Iron sword", 2);
    setWeapon(wep[1], "Steel sword", 4);
    setWeapon(wep[2], "Mithril sword", 7);
    setWeapon(wep[3], "Adamantine sword", 11);
    setWeapon(wep[4], "Dark Magic sword", 16);
    setWeapon(wep[5], "Diamond sword", 23);
}

然后我为我想要创建的每种武器调用setWeapon

void setWeapon(weaponNode *wep, char *name, int bonus)
{
    wep->name = name;
    wep->bonus = bonus;
}

当我运行它时,它适用于钢铁剑,但是一旦它到达秘银剑,它就会卡在wep->name = name

有人有什么想法吗?

【问题讨论】:

  • 指针对指针不是数组。它们不是二维数组。它们不是指向数组的指针。它们不是指向二维数组的指针。只需摆脱指向指针的指针并使用指向结构的普通指针即可。
  • 是的,我没看到 Lundin 说什么! ...您必须使用 void initializeWeapons(weaponNode *wep)setWeapon(wep[0], "Iron sword", 2); 必须是 setWeapon(wep+0, "Iron sword", 2); (或 setWeapon(&wep[0],"Iron sword", 2);
  • 只是挑剔:你确实意识到你正在将const char * 传递给setWeapon,对吧?你不打算稍后修改字符串(或free'ing char * 成员),因为那行不通

标签: c struct crash malloc


【解决方案1】:

当你将一个指向weaponNode 的指针传递给initializeWeapons 函数时,这几乎就像传递一个指针数组,这不是你所拥有的。

initializeWeapons 函数更改为仅采用指向weaponNode 结构的指针,并将其传递给例如setWeapon 使用像 setWeapon(wep + 1, ...) 这样的指针算法,或者像 setWeapon(&wep[1], ...) 这样使用地址运算符。

【讨论】:

  • 感谢您的解释:)
猜你喜欢
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2022-01-10
  • 2020-07-25
相关资源
最近更新 更多