输出二维字符串数组时出现段错误

Seg fault while outputting 2-d array of strings

所以我一直在研究这段代码,我不是很熟练。我创建了两个 类,一个为购物清单定义一个项目,另一个创建一个对象数组并将它们作为列表输出。该程序在我的 windows 命令提示符下运行,但当我使用 cout 语句输出数组时,在 GNU 命令行上出现段错误。

void List::createList(Item ** itemPtr, int size)
{
    string** list1 = new string*[size];
    for(int i = 0; i < 5; i++)
    {
        list1[i] = new string[5];
    }
    for (int i = 0; i < size; i++)
    {
        list1[i][0] = itemPtr[i]->getName();
        list1[i][1] = itemPtr[i]->getUnit();
        list1[i][2] = itemPtr[i]->getSTRnumToBuy();
        list1[i][3] = itemPtr[i]->getSTRcost();
        list1[i][4] = itemPtr[i]->getSTRextCost();
    }
    cout << endl << left << fixed << setw(15) << setprecision(2) << "Name";
    cout << fixed << left << setw(15) << setprecision(2) << "Unit Type";
    cout << fixed << left << setw(15) << setprecision(2) << "# of units";
    cout << fixed << left << setw(15) << setprecision(2) << "Cost/Unit";
    cout << fixed << left << setw(15) << setprecision(2) << "Total" << endl;

    for (int i = 0; i < size; i++)
    {
        cout << fixed << left << setw(15) <<setprecision(2)<<endl<< list1[i][0];
        cout << fixed << left << setw(15) << setprecision(2) << list1[i][1];
        cout << fixed << left << setw(15) << setprecision(2) << list1[i][2];
        cout << fixed << left << setw(15) << setprecision(2) << list1[i][3];
        cout << fixed << left << setw(15) << setprecision(2) << list1[i][4];
    }
}

您的第一个循环应该是:

for(int i = 0; i < size; i++)
{
  list1[i] = new string[5];
}

即循环到size,而不是循环到5.

string** list1 = new string*[size];
for(int i = 0; i < 5; i++)

对我来说这像是一个错误:如果 size < 5 那么您将越界读取您创建的数组。

list1[i][0] = itemPtr[i]->getName();
list1[i][1] = itemPtr[i]->getUnit();
list1[i][2] = itemPtr[i]->getSTRnumToBuy();
list1[i][3] = itemPtr[i]->getSTRcost();
list1[i][4] = itemPtr[i]->getSTRextCost();

如果 itemPtr 数组的大小小于 size,这可能会失败。

还有一点,虽然与您看到的崩溃无关,但您在这里泄漏了内存。 list1 是一个局部变量,未存储在您的 class 中的某处。您在堆上为其分配内存,但不要在任何地方释放该内存 (delete)。

您使用的是 C++ 而不是 C,因此请使用向量的强大功能

void List::createList(Item ** itemPtr, int size) {
    vector<vector<string>> list1;
    list1.resize(size);
    for (int i = 0; i < size; i++) {
        list1[i].resize(5);
        list1[i][0] = itemPtr[i]->getName();
        list1[i][1] = itemPtr[i]->getUnit();
        list1[i][2] = itemPtr[i]->getSTRnumToBuy();
        list1[i][3] = itemPtr[i]->getSTRcost();
        list1[i][4] = itemPtr[i]->getSTRextCost();
    }
    cout << endl << left << fixed << setw(15) << setprecision(2) << "Name";
    cout << fixed << left << setw(15) << setprecision(2) << "Unit Type";
    cout << fixed << left << setw(15) << setprecision(2) << "# of units";
    cout << fixed << left << setw(15) << setprecision(2) << "Cost/Unit";
    cout << fixed << left << setw(15) << setprecision(2) << "Total" << endl;

    for (int i = 0; i < size; i++)
    {
        cout << fixed << left << setw(15) <<setprecision(2)<<endl<< list1[i][0];
        cout << fixed << left << setw(15) << setprecision(2) << list1[i][1];
        cout << fixed << left << setw(15) << setprecision(2) << list1[i][2];
        cout << fixed << left << setw(15) << setprecision(2) << list1[i][3];
        cout << fixed << left << setw(15) << setprecision(2) << list1[i][4];
    }
}

你看妈,没有 news 也没有 deletes.