簡體   English   中英

嘗試使用 cout 在循環中打印出數組時出錯

[英]Error when trying to print out array in a loop using cout

#include <cstdio>
#include <iostream>

int main (){
    int n;
    std::cin>>n;
    int*a;
    for (int i=0;i<n;i++){
        std::cin>>a[i];
    }
    for(int i=0;i<n;i++){
        std::cout<<a[i];
    }

    return 0;
}

我剛剛開始解決一個問題,我想檢查我是否知道如何讀取和排列並制作示例輸出數組。 當我包含第二個循環程序時,只要輸入 n 和第一個數字,程序就會崩潰並顯示以下消息

3 1

進程返回 -1073741819 (0xC0000005) 執行時間:4.943 s 按任意鍵繼續。

int *a; 是一個指向整數的指針,它只是一個指向某個內存的指針,它自己沒有分配內存。 由於您在沒有先設置它的情況下取消引用這個指針a[i] ,您的編譯器甚至應該給您一些警告,告訴您您正在使用一個尚未初始化的變量。

Windows 中的0xC0000005錯誤代碼表示訪問沖突。 在這種情況下,您正在嘗試寫入一些您無權訪問的內存。

您需要先分配內存,然后才能對其進行讀取或寫入。

如果您事先知道將有多少條目,則可以進行靜態內存分配,如果不知道,則需要進行動態內存分配。

例如,如果您知道最多只需要 20 個條目,則可以輕松交換int *a; 對於int a[20]; .

但是由於您只知道程序運行時會有多少條目,那么您需要進行動態內存分配: int *a = new int[n]; .

所以你的代碼應該是

#include <cstdio>
#include <iostream>

int main (){
    int n;
    std::cin>>n;
    int *a = new int[n];
    for (int i=0;i<n;i++){
        std::cin>>a[i];
    }
    for(int i=0;i<n;i++){
        std::cout<<a[i];
    }
    delete[] a; // Release allocated memory.
    return 0;
}

您需要為a分配內存,否則程序的行為是未定義的 寫作

int* a = new int[n];

將它,然后是delete[] a; 當你全部完成后(把它放在return 0;之前)。

或者,使用std::vector<int> a(n); 並且所有的內存分配都會為您處理。

int*是指向 int 的指針,而不是數組。
要創建一個int數組,例如: int a[100]; - 其中 100 是大小

此外,您應該使用std::vector<int>代替:

vector<int> vec;
for (int i = 0; i != n; ++i) {
    int temp;
    cin >> temp;
    vec.emplace_back(temp);
}

嘗試:int a[20]; 而不是 int *a;

你的a沒有指向任何有效的內存,導致未定義的行為。

你需要的是一個std::vector

#include <vector>
int n;
std::cin>>n;
std::vector<int> numbers;
for (int i=0;i<n;i++){
    int val;
    std::cin>>val;
    numbers.push_back(val);
}
for(int i=0;i<n /* or numbers.size()*/ ;i++){
    std::cout<< numbers[i];
}

這會為您處理動態分配,這樣您就不必自己做臟事。

您的代碼存在一些問題。 首先,您請求數字“n”,然后需要分配足夠的空間來存儲這么多整數。

最好的方法是使用矢量。 您可以使用以下方法創建它:

std::vector< int > numbers( n );

您還可以創建它來分配內存,但要等到有數據為止:

std::vector< int > numbers;
numbers.reserve( n );

您可能還應該驗證您的輸入,例如,如果用戶輸入的內容不是整數,則您的輸入流 (cin) 將無效,如果您要嘗試創建一個向量,則原始 'n' 應該是正數那個大小,你可能需要設置一個限制,否則你會遇到bad_alloc 如果您不介意遇到bad_alloc您應該捕獲該異常並打印一個錯誤,例如“沒有足夠的空間來分配盡可能多的數字”。

當然,如果你輸入一個很大的數字,比如 1000 萬,你可能會發現編譯器能夠分配這么多,但是當你要求他輸入 1000 萬次整數時,你的用戶會在你的循環中感到無聊。

您不需要<cstdio>作為標題。 您將需要<vector><iostream>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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