堆栈粉碎终止程序



我正在学习C++,并被赋予了一个程序的任务,该程序允许用户修改包含 10 个整数的数组。 如果用户给出的索引超出范围程序将退出。程序适用于负数和范围内的所有数字。当我输入一个高于范围的数字时,例如 10,我得到:

*

检测到堆栈粉碎 *:已终止

我是新手,任何帮助将不胜感激。

#include <iostream>
#include <array>
using namespace std;
int main()
{
array<int, 10> myData; // creates array size 10
int i = 0;
int v = 0;
for (unsigned int n = 0; n < myData.size(); n++) // makes all elements 1
{
myData[n] = 1;
}
do
{
for (unsigned int a = 0; a < myData.size(); a++)
{
cout << myData[a] << " ";
}
cout << endl << "Input index: ";
cin >> i;
cout << endl << "Input value: ";
cin >> v;
myData[i] = v;
} while (i >= 0 && i < myData.size());
{
cout << endl << "Index out of range: Exit " << endl;
}
return 0;
}

当我运行该程序时,我得到这个:

1 1 1 1 1 1 1 1 1 1
Input index: 10
Input value: 4
Index out of range: Exit
*** stack smashing detected ***: <unknown> terminated
[1]    56 abort (core dumped)  ./edit

您正在访问不属于数组的内存,因此出现该错误消息。在使用下标运算符 [] 分配值之前,应首先验证索引。

以下是导致问题的代码片段(已注释(:

cin >> v;
myData[i] = v; // Direct assignment without validating i
// i needs to be validated before this assignment

我想指出以下几点:

对于具有相同值的初始化,您不需要循环,因为 std::array::fill(( 成员函数正是这样做的。

例:

std::array<int, 10> data;
data.fill( 1 );

您正在使用std::array这意味着您至少正在使用C++11。因此,对于数组遍历,您可以使用 C++11 的 range-for 循环,如下所示:

for ( const auto& i : data )
{
std::cout << i << ' ';
}

如果您还不熟悉自动说明符,则可能需要查看它。

我不知道你在这里使用do-while循环的原因。您可以使用一个简单的while无限循环(出于学习目的(在无效索引输入上使用if-else在分配前验证索引来中断它。

例如:

while ( true )
{
// Print array here...
std::cin >> index;
if ( /* index is out of bounds */ )
{
std::cerr << "ERROR: Out-of-range index!n";
break; // Exit from loop here on invalid index
}
else
{
std::cin >> value;
data[ index ] = value;
}
}

请查看std::array::at()执行边界检查并在违规时抛出异常的成员函数。


我不确定你对这部分做了什么,因为std::cout周围的大括号在这里是多余的:

while(i >= 0  && i < myData.size());    // do-while ends here
{
cout << endl <<"Index out of range: Exit "<< endl;
}

也许,您将do-while与循环混淆while


请不要忘记在将来格式化您的代码。使用 IDE 的代码格式化功能,也可以在 SO 上发布代码时使用任何在线代码格式化站点(例如 http://format.krzaq.cc/(。谢谢!

相关内容

  • 没有找到相关文章

最新更新