传递动态分配的指针时,函数表现不佳

时间:2015-07-22 05:47:44

标签: c++ dynamic shuffle

我有这个功能

int array[FIXED_SIZE];
shuffle_array(array, FIXED_SIZE);

当我从

调用此函数时
int *array = new int[dynamic_size];
shuffle_array(array, dynamic_size);
[...]
delete array;

一切都很顺利,我可以在合理的时间内根据预期检查改组 - 毕竟,它不是一个大的数组(< 1000元素)。

然而,当我从

调用该函数时
int*& array

函数永远循环,没有明显的原因。我已经用调试工具检查了它,我不能说出失败的原因(部分是由于我的算法依赖于随机数)。

问题是,它不起作用...我尝试将数组作为std::vector<int>&传递,我尝试使用random_shuffle,我尝试使用{{1}}(但是大项目的结果并不让我高兴。

为什么会发生这种情况,我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:3)

您的问题是{1}在您的第一个示例中未初始化。如果您使用的是Visual Studio调试模式,array中的每个条目都将设置为全部0xCC(“已创建”)。这掩盖了你的实际问题(见下文)。

使用array时,数组初始化为零。这会导致你的实际错误。

您的实际错误是,您尝试仅在阵列尚未包含该项目时添加新项目,并且每次都在查看整个数组,但是如果您的最后一个元素你的数组已经是一个有效值(比如0),你的循环永远不会终止,因为它总是在数组中找到0并且已经用完了所有其他数字。

要解决此问题,请将算法更改为仅查看已放入数组的值(即最多new int[dynamic_size])。

更改

i

for(j = 0; j < size; j++)

答案 1 :(得分:0)

我猜测问题在于数组的初始化方式和行:

r = mt_lrand() % size; // my RNG function

如果由于某种原因将动态分配的数组初始化为0,则在填充数组的最后一个数字时,代码将始终获得堆栈。

我可以想到以下两种方法来克服这个问题:

  1. 您确保使用大于或等于array的数字初始化size

    int *array = new int[dynamic_size];
    for ( int i = 0; i < dynnamic_size; ++i )
       array[i] = size;
    shuffle_array(array, dynamic_size);
    
  2. 您可以允许随机数介于1size之间,而不是循环中的0size-1之间。第二步,您可以从数组的每个元素中减去1

    void shuffle_array(int* array, const int size){
       int i, j, r;
       bool in_list;
       for(i = 0; i < size; i++){
          in_list = 0;
    
          // Make r to be betwen 1 and size
          r = rand() % size + 1;
          for(j = 0; j < size; j++)
             if(array[j] == r){
                in_list = 1;
                break;
             }
          if(!in_list)
          {
             array[i] = r;
          }
    
          else
             i--;
       }
    
       // Now decrement the elements of array by 1.
       for(i = 0; i < size; i++){
          --array[i];
    
          // Debugging output
          std::cout << "array[" << i << "] = " << array[i] << std::endl;
       }
    }
    

答案 2 :(得分:-1)

您正在将C代码与new和delete的C ++内存分配例程混合使用。而是坚持使用纯C并直接使用malloc / free。

   int *array = malloc(dynamic_size * sizeof(int));
   shuffle_array(array, dynamic_size);
   [...]
   free(array);

另外,如果您在C ++中使用new []运算符分配数组,请使用等效的delete []运算符来正确释放内存。在此处阅读更多内容 - http://www.cplusplus.com/reference/new/operator%20new[]/