我正在尝试通过我的assign和draw函数传递数组。仅存在分配函数以获取wins数组并为该数组中的所有元素分配0值。我的绘制函数使用数组中的20个数字用随机数1-100填充数组。当我尝试编译时,我最终遇到运行时错误,指出我的变量(数组)wins周围的堆栈已损坏。我应该从这里去哪里?
#include<iostream>
#include <ctime>
using std::cout; using std::cin; using std::endl;
void draw(int a[]);
void assign(int a[]);
int sizeofarray = 20;
int main() {
int wins[20] = {};
assign(wins);
cout << "compiled!" << endl;
}
void assign(int a[20]) {
a[20] = {};
draw(a);
}
void draw(int a[])
{
srand(time(nullptr));
int rannum = (1 + rand() % 100);
for (int i = 0; i < 20; i++) {
a[i] = 1 + rand() % 100;
}
}
Run Code Online (Sandbox Code Playgroud)
当您得到一个错误的信息时,您应该立即想到“我有缓冲区溢出”。然后去寻找。
果然,这里是:
void assign(int a[20]) {
a[20] = {}; // <--- BOOM!
draw(a);
}
Run Code Online (Sandbox Code Playgroud)
您的数组只能存储20个元素。当您在第21个元素处存储内容时,您将具有未定义的行为。
只需在此处添加更多信息。您可能以为违规行会将整个数组归零(就像定义变量时一样)。但是,在数组定义之外,情况并非如此。 a[20] = {}是一项任务。
如果希望将数组归零,请使用std::fill以下方法:
std::fill(a, a+20, 0);
Run Code Online (Sandbox Code Playgroud)
但是,我应该指出,在编写的代码上下文中将数组归零是没有意义的。它在输入时已经为零,并且该draw函数无论如何都会初始化每个元素。