簡體   English   中英

C ++數組存儲錯誤的值

[英]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寫入,從而在程序結束時為您提供重復且毫無意義的值。 也許不太明顯的事實是,您還將開始覆蓋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。這是因為在寫入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM