【问题标题】:C++ Program stops working when attribuing values to dynamic array of struct?将值归因于结构的动态数组时,C ++程序停止工作?
【发布时间】:2017-08-10 06:34:16
【问题描述】:

我在运行分配给我修改的代码时遇到问题。

代码正常工作,但我被要求测试代码中的一个函数,所以我制作了一组数据,我将提供函数来测试输出是否是所需的。

但是,每当我运行我的代码时,都会出现一个消息框,提示该程序已停止工作。

这是代码的开头:

    int main(int argc, char *argv[])
{
    int nrMonsters;
    cout << "Hello World!" << endl;
    Monsters *monster[20]={0};


cout<<"Beginning of Test\n...\n";
//the first data set prepared for testing
Monsters *date1[4]= {0};

//date1 - CC BB AA DD
date1[0]->name="CC";
date1[1]->name="BB";
date1[2]->name="AA";
date1[3]->name="DD";
  for (int a=0;a<4;a++)
  {
     date1[a]->type=BALAUR;
     date1[a]->health=10;
  }
cout<<"Set date1 initialised.";

cout<<"\n\nSorting set date1...\t";
sortMonster(4,date1);

结构如下:

    enum MonsterTypes
{
    UNDEFINED=-1,
    VARCOLAC,
    CAPCAUN,
    PAIANJEN,
    SPIRIDUS,
    STRIGOI,
    BALAUR
};

struct Monsters
{
    MonsterTypes type;
    std::string name;
    int health;
};

这是函数的要求(按字母顺序排序):

    void sortMonster(int number_of_monsters, Monsters **monster)
{
/    /sorting
}

当我将鼠标悬停在第二个参数上方时,它显示 “怪物**怪物” 但是当我将它悬停在它初始化的代码顶部时,它会显示 "怪物*mosnter[]"

有谁知道如何解决这个问题? 谢谢。

【问题讨论】:

  • Monsters *monster[20] 你永远不会为这些指针分配内存。
  • date1 是一个由四个空指针组成的数组。你取消引用。通往undefined behavior
  • 要么创建Monsters variables 并使指针指向那些对象(如果需要静态对象),要么为数组中的每个指针分配内存并访问数组的元素(如果需要动态对象 - 这里不要'最后一次使用后不要忘记释放/删除它们)
  • 您的代码中没有“动态数组”。

标签: c++ arrays function pointers


【解决方案1】:

你必须分配内存。

Monsters *date1 = new Monsters[4];

或者使用C风格malloc

不要忘记通过

释放分配的内存
delete []date1;      

free(date1); // if allocated with malloc/calloc

【讨论】:

  • 不建议在Monsters 上使用malloc。使用malloc 分配这些数组,会导致未定义的行为(由于std::string 作为成员,以及malloc 不调用构造函数的事实)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 2018-10-18
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多