我试着输入两个数组,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]的值。
有人可以帮我解决这个问题吗?感谢
答案 0 :(得分:8)
问题是你使用的是一个带有未指定大小的两个堆栈分配数组,因为你用{ }
初始化它们是0。
这些数组不是动态的,你不能像你一样添加元素。它们的大小必须直接指定或通过初始化指定,并且在编译时保留在堆栈上,这意味着如果您尝试访问a
超过其大小的元素,那么您将最终进入{{ 1}}因为它们存储在另一个旁边。
改为使用两个b
,以便您可以
std::vector<int>
答案 1 :(得分:3)
您正在分配没有大小的数组。
如果你想要动态大小的数组,请尝试使用std :: vector。
答案 2 :(得分:2)
正如其他人所提到的,正在发生的事情是你在堆栈中分配空数组,然后访问所述数组的边界。这比你最初意识到的更可怕的后果。
第一个是,正如@Jack所提到的,写作过去a[0]
将开始写b
,在程序结束时给你重复和无意义的值。也许不太明显的是,您也将开始覆盖t
和i
,因为它们是在a
和b
之后在堆栈中分配的。为了说明我的观点,请看下面的输出:
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
成员函数在最后添加项目。