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

时间:2015-10-24 22:09:07

标签: c++ segmentation-fault output gnu

所以我一直在研究这段代码,而且我不是很熟练。我创建了两个类,一个定义了购物清单的项目,另一个创建了一个对象数组,并将它们作为列表输出。该程序在我的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];
    }
}

3 个答案:

答案 0 :(得分:1)

你的第一个循环应该是:

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

即循环到size,直到5。

答案 1 :(得分:0)

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

对我来说看起来像个错误:if size&lt; 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是一个本地变量,不存储在您班级的某个地方。你是在堆上为它分配内存,但是不要把它释放到任何地方(delete)。

答案 2 :(得分:0)

你使用C ++而不是C所以使用向量的力量

Function master(sega)
    master(sega) = WorksheetFunction.SumIf([sega], "<80")
End Function

看Ma,没有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。