输出二维字符串数组时出现段错误
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];
}
}
你看妈,没有 new
s 也没有 delete
s.
所以我一直在研究这段代码,我不是很熟练。我创建了两个 类,一个为购物清单定义一个项目,另一个创建一个对象数组并将它们作为列表输出。该程序在我的 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];
}
}
你看妈,没有 new
s 也没有 delete
s.