[英]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.