[英]C++ arrays store wrong values
我嘗試輸入兩個數組編號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,因為您使用{ }
對其進行了初始化。
這些數組不是動態的,您不能像添加操作那樣添加元素。 必須直接或通過初始化先驗指定它們的大小,並且在編譯時將其保留在堆棧上,這意味着,如果您嘗試訪問a
超過其大小的元素,則由於將它們存儲在下一個位置,因此您將以b
結尾到另一個。
使用兩個std::vector<int>
代替,以便您可以執行
std::vector<int> a;
..
a.resize(t);
..
cin >> a[i]
您正在分配沒有大小的數組。
如果要動態調整大小的數組,請嘗試std :: vector。
正如其他人提到的那樣,發生的事情是您正在堆棧中分配空數組,然后訪問該數組的邊界。 這帶來的后果遠比您最初想象的要可怕。
如@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。這是因為在寫入b[1]
或a[2]
時t
被覆蓋了,全部對應相同的地址,這當然會使循環條件失敗。
要在堆棧中分配數組,必須在編譯時提供大小。 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);
零大小數組在C ++中無效 ,並且此代碼無法與我嘗試過的兩個編譯器一起編譯。
可以使用std::vector
代替原始數組。
使用std::vector
您可以使用push_back
成員函數在末尾添加項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.