c++ 尝试使用数组中的元素时出现警告“使用未初始化的内存'x'“,即使我读取了所有元素[duplicate]

r3i60tvu  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(108)
    • 此问题在此处已有答案**:

(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];
    }
}
esyap4oy

esyap4oy1#

while循环的条件

while (i <= n && j <= m) {
    if (a[i] > b[j]) {
        c[k] = a[i];
        i++;
    }
    else {
        c[k] = b[j];
        j++;
    }
    k++;
}

无效。例如,如果数组an个初始化的元素,则该数组的有效索引在范围[0, n)内。使用表达式a[n]会导致访问数组a之外的内存或读取数组中未初始化的元素。
所以你得写

while (i < n && j < m) {
    if (a[i] > b[j]) {
        c[k] = a[i];
        i++;
    }
    else {
        c[k] = b[j];
        j++;
    }
    k++;
}

还要记住,通常只有当第二个容器(数组)的元素大于第一个容器(数组)的对应元素时,才会将其写入结果容器。
这就是if语句应该看起来像

if ( a[i] < b[j] ) {
        c[k] = b[j];
        j++;
    }
    else {
        c[k] = a[i];
        i++;
    }

如果你想按降序合并数组。
或者

if ( b[j] < a[i] ) {
        c[k] = b[j];
        j++;
    }
    else {
        c[k] = a[i];
        i++;
    }

如果你想按升序合并数组,你要按升序合并数组。
这些while循环

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];
    }
}

可以是无限循环,因为变量i和变量j在循环中都没有改变,至少它们试图将相同的元素a[i]b[j]赋给数组c的元素。此外,变量k的值可以大于变量n的值并且大于变量m的值,但是数组a或数组b具有尚未复制到数组c中的元素。
你应该写

while (i < n) c[k++] = a[i++];
while (j < m) c[k++] = b[j++];

注意,应检查变量nm的输入值不大于100
而且用201元素而不是200元素声明数组c也没有什么意义

int a[100], b[100], c[201];

注意,在头文件<algorithm>中声明了标准算法std::merge,您可以使用它。

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    int a[] = { 1, 3, 5, 7, 9 };
    int b[] = { 0, 2, 4, 6, 8, 10 };
    int c[std::size( a ) + std::size( b )];

    std::merge( a, a + std::size( a ), b, b + std::size( b ), c );

    for (const auto item : c)
    {
        std::cout << item << ' ';
    }
    std::cout << '\n';
}

程序输出为

0 1 2 3 4 5 6 7 8 9 10

在程序中没有使用标准函数std;:begin和std::end,因为在你的程序中你使用了子数组。虽然你可以在你的程序中写

std::merge( std::begin( a ), std::next( std::begin( a ), n ),
                std::begin( b ), std::next( std::begin( b ), m ),  
                std::begin( c ) );

你可以使用标准的容器std::vector<int>来代替预先定义好的数组,它允许指定任意数量的元素,对于容器的对象,你可以使用相同的下标操作符。

1bqhqjot

1bqhqjot2#

当你写while (i <= n && j <= m)的时候,你可能会在数组的末尾得到一个元素。
此外,如果您希望数组包含用户所需的任意多的项,请使用动态分配。

int *a = new int[n];

相关问题