我试图安排随机数组。在代码中,它只是按大小交换位置的第一步。 运行代码时,获取调试错误和交换后的输出显示数组中的第一个数字已删除,而最后一个数字是内存中的长随机数。 看起来它从i = 1开始交换,为什么?
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void buildArray(int arr[], int size) {
srand ( (unsigned int)time(NULL) );
for(int i = 0; i < size; ++i)
arr[i] = rand() % 50 + 0;
}
void dispArray(int arr[], int size) {
for(int i = 0; i < size; ++i)
cout << i << ": " << arr[i] << endl;
}
int main()
{
const int size = 5;
int arr[size];
buildArray(arr, size);
dispArray(arr, size);
int swapHolder = -1;
for(int i = 0; i < size; ++i) {
if(arr[i] > arr[i+1]) {
swapHolder = arr[i+1];
arr[i+1] = arr[i];
arr[i] = swapHolder;
cout << endl;
}
}
dispArray(arr, size);
return 0;
}
Output example:
0: 46
1: 15
2: 47
3: 5
4: 19
0: 15
1: 46
2: 5
3: 19
4: -858993460
答案 0 :(得分:2)
以下是问题:if(arr[i] > arr[i+1])
,您的for循环来自[0, size - 1]
,所以在最后一次迭代中,我们说size = 5
,您将测试if(arr[5] > arr[6])
,访问未初始化的arr[6]
,正确的方法是让你的for循环从[0, size - 2]
开始:
for(int i = 0; i < size - 1; ++i) ...
答案 1 :(得分:1)
for(int i = 0; i < size; ++i) {
if(arr[i] > arr[i+1]) {
swapHolder = arr[i+1];
arr[i+1] = arr[i];
最后一次迭代是针对 i = size -1 。然后
if(arr[i] > arr[i+1])
表示访问数组超出范围。这是未定义的行为。