C ++数组存储错误的值

时间:2016-06-27 22:08:28

标签: c++ arrays numbers

我试着输入两个数组,A和B.但是每次输入最后一个B数时,除了改变B [i + n]的值外,它还会替换A [0]的值。 这是代码:

#include <iostream>

    using namespace std;

    /*
     * 
     */
    int main(int argc, char** argv) {
        int a[] = {};
        int b[] = {};
        int t, i;

        cout << "Amount of numbers: ";
        cin >> t;

        for (i = 0; i < t; i++) {
            cout << "Enter number for A" << i+1 << ": ";
            cin >> a[i];
            cout << "Enter number for B" << i+1 << ": ";
            cin >> b[i];
        }

        for (i = 0; i < t; i++) {
            cout << a[i] << " ";
            cout << b[i] << " ";
        }
        return 0;
    }

例如

Amount of numbers: 2
Enter number for A1: 1
Enter number for B1: 2
Enter number for A2: 3
Enter number for A3: 4

输出应该是1 2 3 4,但是从我得到的代码4 2 3 4(B [1]替换A [0]的值。

有人可以帮我解决这个问题吗?感谢

4 个答案:

答案 0 :(得分:8)

问题是你使用的是一个带有未指定大小的两个堆栈分配数组,因为你用{ }初始化它们是0。

这些数组不是动态的,你不能像你一样添加元素。它们的大小必须直接指定或通过初始化指定,并且在编译时保留在堆栈上,这意味着如果您尝试访问a超过其大小的元素,那么您将最终进入{{ 1}}因为它们存储在另一个旁边。

改为使用两个b,以便您可以

std::vector<int>

答案 1 :(得分:3)

您正在分配没有大小的数组。

如果你想要动态大小的数组,请尝试使用std :: vector。

答案 2 :(得分:2)

正如其他人所提到的,正在发生的事情是你在堆栈中分配空数组,然后访问所述数组的边界。这比你最初意识到的更可怕的后果。

第一个是,正如@Jack所提到的,写作过去a[0]将开始写b,在程序结束时给你重复和无意义的值。也许不太明显的是,您也将开始覆盖ti,因为它们是在ab之后在堆栈中分配的。为了说明我的观点,请看下面的输出:

Amount of numbers: 2
Enter number for A1: 1
Enter number for B1: 2
Enter number for A2: 3
Enter number for B2: 4
Enter number for A3: 5
Enter number for B3: 6
a[0] 0x7fffffffe2e0 -> 1
b[0] 0x7fffffffe2e4 -> 3
a[1] 0x7fffffffe2e4 -> 3
b[1] 0x7fffffffe2e8 -> 5
a[2] 0x7fffffffe2e8 -> 5
b[2] 0x7fffffffe2ec -> 2
a[3] 0x7fffffffe2ec -> 3
b[3] 0x7fffffffe2f0 -> 4197280
a[4] 0x7fffffffe2f0 -> 4197280
b[4] 0x7fffffffe2f4 -> 0
t 0x7fffffffe2e8 -> 5
i 0x7fffffffe2ec -> 5

您会注意到该程序没有按预期运行,并且系统会提示您输入A / B3,而不仅仅是预期的2.这是因为t或{{b[1]时会覆盖a[2] 1}}被写入,因为它们都对应相同的地址,这当然使循环条件失败。

要在堆栈中分配数组,必须在编译时提供大小。 int a[10]等。在执行前知道大小时使用。如果大小未知,就像您的情况一样,您可以使用new[]在堆中分配一个数组,如下所示。

cout << "Amount of numbers: ";
cin >> t;

int* a = new int[t];
int* b = new int[t];

这当然会给你预期的结果:

Amount of numbers: 2
Enter number for A1: 1
Enter number for B1: 2
Enter number for A2: 3
Enter number for B2: 4
a[0] 0x603010 -> 1
b[0] 0x603030 -> 2
a[1] 0x603014 -> 3
b[1] 0x603034 -> 4
t 0x7fffffffe2d8 -> 2
i 0x7fffffffe2dc -> 2

当然,建议的解决方案是使用std容器,即std::vector,在那里为您完成堆分配,您只需编写:

std::vector<int> a;
std::cin >> input;
a.push_back(input); 

答案 3 :(得分:1)

C ++中的零大小数组无效,此代码无法使用我尝试过的两个编译器进行编译。

您可以使用std::vector

代替原始数组

使用std::vector,您可以使用push_back成员函数在最后添加项目。