【问题标题】:Variable size array sorter bugging with no reason可变大小数组排序器无缘无故地窃听
【发布时间】:2015-04-22 22:37:08
【问题描述】:

我正在编写一个算法,要求用户告诉数组的大小,然后告诉它的值。之后,代码对值进行排序并返回结果。代码如下:

#include <iostream>
#include <string>

using namespace std;
int nvals, k, var, size;

void mysort(int arrayy[]){ 
    int i,j; 
    int temp; 
    for(i=0;i<size;i++) 
        for(j=0;j<size;j++) 
            if(arrayy[j]>arrayy[j+1]){ 
                temp=arrayy[j]; 
                arrayy[j]=arrayy[j+1]; 
                arrayy[j+1]=temp; 
            } 
    cout << "Your sorted array is: [";
    for(i=1;i<10;i++) cout<<arrayy[i]<<", ";
    cout << "].\n";
}

void main(int argc){
    cout << "Number of variables" << endl;
    cin >> size;
    int *arrayy;
    arrayy = new int[size];
    for (int iii=0;iii<size;iii++){
        cout << "Enter number:" << endl;
        cin >> var;
        arrayy[iii] = var;
    }
    mysort(arrayy);
}

不幸的是,编译后输出Your sorted array is: [然后突然崩溃了!我一直在尝试操纵一些东西,看看我是否可以让它发挥作用,但我没有成功。如何修复代码以使其正常工作?谢谢。

【问题讨论】:

  • 使用std::vector不是更有意义吗?在这里看到像10 这样的神奇数字通常表明如果超出该界限,将会出现可怕的错误。
  • 天哪。我是一个白痴。只需将所有“10”替换为“size”,代码就可以正常工作了。
  • 这是你学习的方式,所以不用担心。像这样使用 C 风格的数组充满了麻烦。这就是为什么 C++ 容器通常更好。例如,它们带有内置的排序功能,因此您不必自己编写。这种冒泡排序不会超出微不足道的数据量。
  • @Nobody:您在这里错过了10for(i=1;i&lt;10;i++) cout&lt;&lt;arrayy[i]&lt;&lt;", ";
  • 谢谢@BillLynch。将其替换为size,现在可以正常工作了。但我不完全确定它为什么会工作,即使它访问像 arrayy[j+1] 这样的值

标签: c++ arrays dynamic-memory-allocation


【解决方案1】:

假设size == 4

您最终将设置j == 3,然后访问arrayy[j]arrayy[j+1]。此时访问 arrayy[j+1] 会引发未定义的行为,因为它位于数组之外。

【讨论】:

  • 是的,但是当它打印数组时,可以将其设置为仅输出输入的值。该代码将使用比预期更多的内存,但它会正常工作。我说的对吗?
  • @Nobody: 不,因为你arrayy[j+1] 写到了数组的末尾,破坏了随机内存。这会导致程序在某个随机完全不相关的点崩溃。比如...打印数字时。
  • 为什么它工作正常呢?如果你的想法是对的,代码应该写成for(i=0;i&lt;(size-1);i++){ and for(j=0;j&lt;(size-1);j++){,不是吗?
  • @Nobody:未定义的行为会导致未定义的行为。未定义行为的一种可能结果是它工作正常。但它可能会在不同的编译器/一天中的时间发生微妙的变化。
【解决方案2】:

将“10”的所有条目替换为“size”,您将得到所需的内容:

#include <iostream>
#include <string>

using namespace std;

int k, size;
void mysort(int arrayy[]){ 

    int i,j; 
    int temp; 
      for(i=0;i<size;i++) 
     for(j=0;j<size;j++) 
      if(arrayy[j]>arrayy[j+1]){ 
         temp=arrayy[j]; 
         arrayy[j]=arrayy[j+1]; 
         arrayy[j+1]=temp; 
       } 
    cout << "Your sorted array is: [";
    for(i=1;i<=size;i++) {
        if (i<size){
            cout<<arrayy[i]<<",";
        }
        else
            cout<<arrayy[i];
    }
    cout << "].\n";
}

void main(int argc){
    cout << "Number of variables" << endl;
    cin >> size;
    int *arrayy;
    arrayy = new int[size];
    for (int iii=0;iii<size;iii++){
        cout << "Enter number:" << endl;
        cin >> arrayy[iii];
    }
    mysort(arrayy);
}

另外,我添加了一些格式化行,以便您的数组可以在第二个括号附近很好地格式化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-23
    • 2016-05-07
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多