c++ - 使用我在一个函数中修改的数组时,在另一个函数中得到一个奇怪的负数
问题描述
我正在编写一个程序,该程序接受用户输入的最多 25 个整数的列表,然后使用冒泡排序打印排序列表,按降序排列排序列表,以及有关列表的其他一些信息,如中位数、最小值和最大值,以及模式。
我已经在我使用初始化列表(不是来自用户输入/cin)创建的数组上单独测试了程序中的所有函数,它们工作正常,但是当我运行程序时,有些东西是关闭的。例如,当我输入 1,2,3,4 时,按降序打印排序列表的函数会打印 3,2,1,-858993460。无论我将什么值放入输入数组,它总是会忽略最大的整数并在最后添加 -858993460。这是我的代码的相关部分:
#include <iostream>
using namespace std;
void input(int ulist[26], int& n);
void Bubblesort(int ulist[26], int slist[26], int n);
void print(int list[26], int n);
int n;
void reversesort(int slist[26], int n);
void main()
{
int ulist[26], slist[26];
input(ulist, n);
cout << "Unsorted";
print(ulist, n);
cout << "Sorted";
Bubblesort(ulist, slist, n);
print(slist, n);
reversesort(slist, n);
cin >> n;
}
void input(int ulist[26], int& n)
{
int i(0), value;
cout << "enter value : \n";
cin >> value;
while (i < 25 && value != -999)
{
ulist[i] = value;
i++;
if (i < 25)
{
cin >> value;
}
}
n = i;
}
void Bubblesort(int ulist[26], int slist[26], int n)
{
int i, j, temp;
for (i = 0; i < n; i++)
slist[i] = ulist[i];
for (j = 25 - 1; j > 0; j--) //25 is Length of the array
for (i = 0; i < j; i++)
if (slist[i] > slist[i + 1])
{
temp = slist[i];
slist[i] = slist[i + 1];
slist[i + 1] = temp;
}
}
void print(int list[26], int n)
{
int i;
cout << " list of numbers are : \n";
for (i = 0; i < n; ++i)
{
cout << list[i] << '\n';
}
cout << "\n\n";
}
void reversesort(int slist[26], int n) //checked w online compiler, works
{
cout << "List of numbers in descending order is: \n";
for (int i = n - 1; i >= 0; --i)
cout << slist[i] << ", ";
cout << "\n";
}
我假设这是某种内存问题,并且其根源与通过我编写的函数在气泡排序函数中修改的传递 slist 有关。我对 C++(来自 python)很陌生,所以我假设我在将数组传递给函数方面遗漏了一些东西。
编辑:我想总结一下 - 我怎样才能获取输入函数中输入的数据并在另一个函数中使用该数组?以及如何获取已由bubblesort 函数排序的数组并在另一个函数中使用该数组?
解决方案
代码中未定义行为的第一个实例是
if (slist[i] > slist[i + 1])
在Bubblesort
.
由于
for (j = 25 - 1; j > 0; j--)
for (i = 0; i < j; i++)
此循环访问的最大索引是slist[24]
(24 from i + 1
where i < j
and j = 25 - 1 = 24
, so i = 23
)。
你输入的只有 4 个数字,所以只有slist[0]
throughslist[3]
被初始化。其余元素(slist[4]
通过slist[25]
)未初始化。从未初始化的变量中读取具有未定义的行为。
推荐阅读
- java - 我想以一个字符只重复一次的方式修剪一个字符串
- react-native - React native 0.61.5 Build 在 Xcode 12.5 beta 上失败
- python - 在python中使用不同的键合并两个字典
- r - 一个for循环和一个子for循环,存储数据
- liquibase - 快照的 liquibase 差异 - 参数错误
- javascript - 即使在存储在 JS localStorage 中的页面刷新后,仍将数据保留在主页上
- excel - excel自动填充数字以获取特殊值
- laravel - SQLSTATE [HY000]:一般错误:1366 不正确的整数值:“null”在 Nullable 列上
- flutter - 在 TabBar Flutter 中删除选定栏下的淡入淡出
- .net - 使用 FluentFtp 上传文件时保留上次修改日期