- 此问题在此处已有答案**:
(18个答案)
What happens when I print an uninitialized variable in C++? [duplicate](4个答案)
14小时前关门了。
我试图组合两个排序数组,当我比较两个元素时,每个元素来自两个数组中的一个,我得到警告"使用未初始化的内存'x'"。
以下是我的意见:
5
1 3 5 7 9
5
2 4 6 8 10
并且输出:
-858993460-858993460-858993460-858993460-858993460-858993460-858993460-858993460-858993460-858993460-858993460
下面是我的代码:
#include <iostream>
int main() {
int n, m;
int a[100], b[100], c[201];
std::cin >> n;
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
std::cin >> m;
for (int i = 0; i < m; i++) {
std::cin >> b[i];
}
int i = 0; int j = 0; int k = 0;
while (i <= n && j <= m) {
if (a[i] > b[j]) {
c[k] = a[i];
i++;
}
else {
c[k] = b[j];
j++;
}
k++;
}
while (i < n) {
for (int p = k; p < n; p++) {
c[p] = a[i];
}
}
while (j < m) {
for (int p = k; p < m; p++) {
c[p] = b[j];
}
}
for (int i = 0; i < k; i++) {
std::cout << c[k];
}
}
2条答案
按热度按时间esyap4oy1#
while循环的条件
无效。例如,如果数组
a
有n
个初始化的元素,则该数组的有效索引在范围[0, n)
内。使用表达式a[n]
会导致访问数组a
之外的内存或读取数组中未初始化的元素。所以你得写
还要记住,通常只有当第二个容器(数组)的元素大于第一个容器(数组)的对应元素时,才会将其写入结果容器。
这就是if语句应该看起来像
如果你想按降序合并数组。
或者
如果你想按升序合并数组,你要按升序合并数组。
这些while循环
可以是无限循环,因为变量
i
和变量j
在循环中都没有改变,至少它们试图将相同的元素a[i]
和b[j]
赋给数组c
的元素。此外,变量k
的值可以大于变量n
的值并且大于变量m
的值,但是数组a
或数组b
具有尚未复制到数组c
中的元素。你应该写
注意,应检查变量
n
和m
的输入值不大于100
。而且用
201
元素而不是200
元素声明数组c
也没有什么意义注意,在头文件
<algorithm>
中声明了标准算法std::merge
,您可以使用它。程序输出为
在程序中没有使用标准函数
std;:begin
和std::end,因为在你的程序中你使用了子数组。虽然你可以在你的程序中写你可以使用标准的容器
std::vector<int>
来代替预先定义好的数组,它允许指定任意数量的元素,对于容器的对象,你可以使用相同的下标操作符。1bqhqjot2#
当你写
while (i <= n && j <= m)
的时候,你可能会在数组的末尾得到一个元素。此外,如果您希望数组包含用户所需的任意多的项,请使用动态分配。