数组变量周围的堆栈损坏

Posted

技术标签:

【中文标题】数组变量周围的堆栈损坏【英文标题】:stack around array variable corrupted 【发布时间】:2019-10-04 04:12:47 【问题描述】:

我正在尝试通过我的分配和绘制函数传递我的数组。 assign 函数仅用于获取 wins 数组并为数组中的所有元素分配 0 值。我的绘图函数用随机数 1-100 填充数组,数组中有 20 个数字。当我尝试编译时,我最终得到一个运行时错误,指出我的变量(数组)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;
    



【问题讨论】:

你希望a[20] = ; 行做什么? 使用 std::fill 代替 a[20]=0。 【参考方案1】:

当您收到这样有用的信息的错误时,您应该立即想到“我有缓冲区溢出”。那就去找吧。

果然来了:

void assign(int a[20]) 
    a[20] = ;            // <--- BOOM!
    draw(a);

您的数组只能存储 20 个元素。当您在第 21 个元素处存储某些内容时,您的行为未定义。

只是在此处添加更多信息。 可能您认为有问题的行会将整个数组初始化为零(就像定义变量时一样)。但是,在数组定义之外,情况并非如此。 a[20] = 是一个作业。

如果您希望将数组归零,请使用std::fill,如下所示:

std::fill(a, a+20, 0);

但是,我应该指出,在您编写的代码上下文中将数组归零是没有意义的。它在输入时已经归零,并且draw 函数无论如何都会初始化每个元素。

【讨论】:

ive 实际上也尝试删除赋值括号,它似乎有效,但是当我进行函数调用并尝试打印函数的结果时,它没有列出随机的 20 个数字,但是而是看起来像十六进制代码的东西。请原谅我缺乏这方面的知识,但我刚刚开始使用 c++,我非常乐意接受帮助! 解密您所说的内容,我感觉您尝试使用cout &lt;&lt; wins 打印数组。那只打印指针。如果要显示数组的内容,必须循环遍历并输出每个值。 是的,我通过绘图函数中的循环运行它,它就像一个魅力。非常感谢稻田

以上是关于数组变量周围的堆栈损坏的主要内容,如果未能解决你的问题,请参考以下文章

堆栈周围的变量损坏。为啥会这样? [关闭]

变量“Yarray”周围的堆栈已损坏

运行时检查失败 #2 - 变量“结果”周围的堆栈已损坏

运行时检查失败 #2 - 变量“primes”周围的堆栈已损坏

运行时检查失败 #2 - 变量“索引”周围的堆栈已损坏

运行时检查失败 #2 - 变量“e_color”周围的堆栈已损坏