输出二维字符串数组时出现segfault

Seg fault while outputting 2-d array of strings

本文关键字:数组 segfault 字符串 二维 输出      更新时间:2023-10-16

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

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++)

看起来像一个bug:如果size <</p>

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是一个局部变量,它不存储在类的某个地方。您在堆上为它分配内存,但不要在任何地方释放该内存(delete)。

您使用的是c++而不是C,所以请使用vector

的功能
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];
    }
}

看,妈,没有new s,也没有delete s。