c++ - 得到分离故障(核心转储)
问题描述
在 shuffle_array() 的返回部分之前,一切似乎都运行良好,但我不确定是什么。
int * shuffle_array(int initialArray[], int userSize)
{
// Variables
int shuffledArray[userSize]; // Create new array for shuffled
srand(time(0));
for (int i = 0; i < userSize; i++) // Copy initial array into new array
{
shuffledArray[i] = initialArray[i];
}
for(int i = userSize - 1; i > 0; i--)
{
int randomPosition = (rand() % userSize;
temp = shuffledArray[i];
shuffledArray[i] = shuffledArray[randomPosition];
shuffledArray[randomPosition] = temp;
}
cout << "The numbers in the initial array are: ";
for (int i = 0; i < userSize; i++)
{
cout << initialArray[i] << " ";
}
cout << endl;
cout << "The numbers in the shuffled array are: ";
for (int i = 0; i < userSize; i++)
{
cout << shuffledArray[i] << " ";
}
cout << endl;
return shuffledArray;
}
抱歉,如果空格在这里关闭,不知道如何将代码复制和粘贴到这里,所以我必须手动完成。编辑:还应该提到这只是代码的一小部分,而不是我正在处理的整个项目。
解决方案
有几个严重程度不同的问题,这是我标记它们的最佳尝试:
int shuffledArray[userSize];
该数组具有可变长度。我不认为它像其他用户指出的那样糟糕,但是您应该知道 C++ 标准不允许这样做,因此您不能期望它适用于您尝试的每个编译器(GCC 和 Clang 将让你这样做,但 MSVC 不会,例如)。
srand(time(0));
这很可能超出了您的分配范围(您可能被告知“使用rand
/ srand
”作为简化),但rand
与 C++ 语言提供的其他内容相比,它实际上是一个糟糕的随机数生成器。它相当慢,它快速重复(rand()
按顺序调用最终将开始返回与之前相同的序列),仅基于几个样本很容易预测,并且不统一(某些值具有更高的概率比其他人退还)。如果你追求 C++,你应该研究<random>
标题(实际上,如何使用它,因为不幸的是它不是简单的光辉示例)。
此外,播种time(0)
将为您提供每秒仅更改一次的序列。这意味着如果您shuffle_array
连续两次快速调用,您很可能会得到相同的“随机”命令。(这是人们经常会srand
在 中调用一次的原因之一main
。)
for(int i = userSize - 1; i > 0; i--)
通过迭代到i > 0
,您将永远不会进入循环i == 0
。这意味着您有可能永远不会交换第零个元素。(它仍然可以被另一个迭代交换,这取决于你的运气,但这显然是一个错误。)
int randomPosition = (rand() % userSize);
您应该知道这是有偏差的:因为 的最大值rand()
可能不能被 整除userSize
,所以您获得小值的可能性略高于大值。您可能只需阅读说明并继续进行作业即可。
return shuffledArray;
这是一个硬错误:返回为函数分配的存储空间是不合法的。在这种情况下,内存 forshuffledArray
在函数开始时自动分配,重要的是,它在结束时自动释放:这意味着您的程序将重用它用于其他目的。从它读取可能会返回已被某些代码覆盖的值,而写入它可能会覆盖当前由其他代码使用的内存,这可能会产生灾难性后果。
当然,我写所有这些都是假设您使用shuffle_array
. 如果你不使用它,你不应该返回它(尽管在这种情况下,它不太可能是你的程序崩溃的原因)。
在函数内部,可以将指向自动存储的指针传递给另一个函数,但返回它是绝对不行的。如果你不能使用std::vector
(这是最好的选择,IMO),你还有其他三个选择:
shuffle_array
接受与已经相同大小的 a ,shuffledArray[]
并且initialArray
不返回任何内容;shuffle_array
改为修改(您正在使用initialArray
的改组算法是就地的,这意味着即使您不复制原始输入,您也会得到正确的结果)- 动态分配内存用于
shuffledArray
usingnew
,这将防止它在函数结束时被自动回收。
选项 3 要求您使用手动内存管理,这在当今通常是不受欢迎的。我认为选项 1 或 2 是最好的。选项 1 如下所示:
void shuffle_array(int initialArray[], int shuffledArray[], int userSize) { ... }
和userSize
的大小在哪里。在这种情况下,调用者需要拥有.initialArray
shuffledArray
shuffledArray
推荐阅读
- python-3.x - glob.glob 打印返回未知字符块
- java - Java - 如何在两个字符之间进行随机猜测?
- matlab - Matlab指南GUI工具/按钮?
- javascript - 来自浏览器的 GET 请求可以将文件下载到本地,但 XMLHttpRequest Javascript 脚本不下载文件
- ruby - Ruby 中的欢迎电子邮件
- c++ - c++向量push_back问题
- java - Java:处理日期
- c# - InternetExplorerDriver 的注册表项 HKEY_LOCAL_MACHINE\...\FEATURE_BFCACHE 如何解决 Internet Explorer 11 问题?
- php - 动态子类别未正确显示
- karate - 无法在空手道功能文件中打印标题