首页 > 解决方案 > 得到分离故障(核心转储)

问题描述

在 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;
}

抱歉,如果空格在这里关闭,不知道如何将代码复制和粘贴到这里,所以我必须手动完成。编辑:还应该提到这只是代码的一小部分,而不是我正在处理的整个项目。

标签: c++

解决方案


有几个严重程度不同的问题,这是我标记它们的最佳尝试:

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的改组算法是就地的,这意味着即使您不复制原始输入,您也会得到正确的结果)
  • 动态分配内存用于shuffledArrayusing new,这将防止它在函数结束时被自动回收。

选项 3 要求您使用手动内存管理,这在当今通常是不受欢迎的。我认为选项 1 或 2 是最好的。选项 1 如下所示:

void shuffle_array(int initialArray[], int shuffledArray[], int userSize) { ... }

userSize的大小在哪里。在这种情况下,调用者需要拥有.initialArrayshuffledArrayshuffledArray


推荐阅读