gpt4 book ai didi

c++ - 数组大小超过函数大小(C++)

转载 作者:行者123 更新时间:2023-12-01 14:44:19 25 4
gpt4 key购买 nike

首先,我要说我对编程总体而言还是一个新手。解决方案可能真的很明显。

基本上,我需要编写代码以在1到500之间随机生成10,000个数字(某些数字会在整个数组中重复出现。这是问题所在,要为所述数组赋值,我打算将其放入int类型的函数中,从那里去,但是数组根本不适合该函数,在这种情况下,有没有办法使用一个循环为数组中的所有变量赋值?

如果我尝试从函数调用它,则会收到这2条警告消息:

1)
警告C6262函数使用堆栈的'40012'字节:超出/ analyze:stacksize'16384'。考虑将一些数据移动到堆。

2)
警告C6201索引'10000'不在有效的索引范围'0'到'9999'中,可能是堆栈分配的缓冲区'numsinarray'

编辑:我在Visual Studio 2019上工作

这是代码

#include <iostream>
#include <random>
using namespace std;
std::random_device seed;
std::mt19937 mersenneTwister(seed());
const int AmountOfNum = 10000;

const int RandomInt(int min, int max);
int NumGen(int min, int max);

int main()
{





}

const int RandomInt(int min, int max)
{
std::uniform_int_distribution<int> distribution(min, max);
return distribution(mersenneTwister);
}

int NumGen(int min, int max)
{
int numsinarray[AmountOfNum];

for (int i = 0; i <= AmountOfNum; i++)
{
numsinarray[i] = RandomInt(1, 500);

}

}

最佳答案

欢迎使用堆栈溢出,具有讽刺意味的是,这里的问题是堆栈溢出。
在此代码段中,您将分配4个字节的10'000整数,即总共40'000字节,这对于堆栈中的内容来说是很多。

int numsinarray[AmountOfNum];

什么是堆栈?:
stack是操作系统分配的用于执行程序的内存区域,它是存放本地变量,函数调用,返回值等的位置。
当CPU完成运行功能时,哪个帮助可以跟踪功能调用以及返回的位置。

我的问题有什么解决方案?:(Dynamic memory)
解决方案很简单,但要承担责任。每当您尝试分配较大的内容时,都必须考虑 Heapheap是您可以在其中获得尽可能多的操作系统和PC处理能力的内存的地方。

如何从堆中分配?
int* numsinarray = new int[AmountOfNum]; // syntax : TYPE* ptr = new TYPE[NB];

就这么简单,但是还记得我前面提到的责任吗?
每当从堆中分配时,都必须显式释放完成后保留的内容(不再需要数据)

如何免费?
delete[] numsinarray;

语法为:
delete[] ptr; // if its an array or 
delete ptr; // if you allocate only one element

您的代码将是:
int main()
{
int* my_arr = NumGen(0, 500);
// use my array.. more code...
delete[] my_arr; // free my array I dont need it anymore
}

int RandomInt(int min, int max) // the const here is useless (I removed it)
{
std::uniform_int_distribution<int> distribution(min, max);
return distribution(mersenneTwister);
}

int* NumGen(int min, int max)
{
int* numsinarray = new int[AmountOfNum];

for (int i = 0; i < AmountOfNum; i++) // must be < not <= the latter will reach AmountOfNum
//which is already out of the array (array's in C/C++ are indexed in [0..n-1]
{
numsinarray[i] = RandomInt(1, 500);

}
// do more processing maybe return the pointer of you array
return numsinarray;
}

确保不要释放指针两次,也不要在释放指针后再次使用它。

听起来还有其他选择吗?
令人遗憾的是,要成为一名优秀的程序员,您必须处理堆,但是如果您正在寻找其他解决方案,那么标准库(STL)为我们提供了 std::vector,它为您更易于操作,处理和自动处理堆问题。

关于c++ - 数组大小超过函数大小(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58583935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com