2016-10-11 7 views
-2

質問を下さっているのであれば、なぜもっと良い質問をするのかを教えてください。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; 
} 

私はちょうど問題に取り組んで始めたと私は私が読んで、アレイとサンプル出力配列を作成する方法を知っていたかどうかを確認したかったです。 I nを入力としてIはすぐに第2ループのプログラムがクラッシュを含む場合の処理​​は、-1073741819(0xc0000005)に実行時間返さ

次のメッセージが最初の数:4.943秒 任意のキーを押し続ける。

+3

どこにも配列がありません。 'a'は何も指さないポインタです。索引を作成しようとすると、未定義の動作が発生します。私は[書籍](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を取得することをお勧めします –

+0

ここでポインタを気にしないで、サイズは 'std :: vector'を使ってください。 – George

+0

@ M.M無礼なコメントありがとうございました。 – maltkat

答えて

0

あなたは、そうでない場合は、プログラムの動作は未定義で、aためメモリを割り当てる必要があります。

int* a = new int[n];

を書くことは、あなたがすべて(ちょうどreturn 0;前にこれを入れて)完了したらdelete[] a;続く、それをするためだろう。

また、std::vector<int> a(n);と、すべてのメモリ割り当ては、あなたのための世話をされます使用します。

int*
+0

ああ、いいえ、彼はそれを読んで前に、新しいものを開始するこの男を取得しないでください。 – George

0

はintへのポインタではなく配列です。 int a[100];から100サイズ

また、かわりにstd::vector<int>を使用する必要がある:intの配列、例えば作成する

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

試してください。[20] INTと、 int *ではなくむしろ;

+0

なぜ20?彼は数を要求し、その整数を入力します。彼はベクトルを使うべきです。 – CashCow

+0

私は彼のプログラムをテストするために手で20以上の整数を入力しないので、上記の最後の解決策がベクトルより良いと思っています。 – Treycos

+0

20 – manianis

0

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]; 
} 

これはあなたのための動的割り当ての世話をします。

1

int *a;は整数へのポインタであり、いくつかのメモリへのポインタだけは、それ自身に割り当てられないメモリを有していません。最初にこのポインタを設定せずにこのポインタa[i]を逆参照しているので、コンパイラは初期化されていない変数を使用しているという警告を表示する必要があります。

0xC0000005 Windowsのエラーコードはアクセス違反を意味します。この場合、アクセスしていないメモリに書き込もうとしています。

メモリを読み書きする前に、まずメモリを割り当てる必要があります。

そうでない場合は、あなたが持っているだろう、事前にどのように多くのエントリがわかっている場合は、静的なメモリ割り当てを行うことができます、そしてあなたは、動的なメモリ割り当てを行う必要があります。

たとえば、最大で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; 
} 
0

でなければなりません。主に、番号 'n'を要求し、その多くの整数を格納するのに十分なスペースを割り当てる必要があります。

これを実行する最良の方法は、ベクターを使用することです。あなたがこれを作成することができます。

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

あなたはまた、メモリを割り当てていますが、データを持っているまで待って、それを作成することができます。

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

また、おそらくあなたの入力を検証する必要があり、例えば、あなたの入力ストリーム(CINは)は、ユーザーが整数ではないものを入力し、元の 'n'がそのサイズのベクトルを作成しようとしている場合に正でなければならず、制限を設定する必要があるか、 a bad_allocbad_allocに苦しんでも問題がなければ、その例外を捕らえて、「多くの番号を割り当てるには十分なスペースがない」などのエラーを出力する必要があります。

もちろん、1000万のような高い数値を入力すると、コンパイラはその多くを割り当てることができますが、1000万回の整数を入力するように要求するとループに飽きてしまいます。

ヘッダーとして<cstdio>は必要ありません。 <vector><iostream>が必要です。

関連する問題