2016-11-27 1 views
-2

私はテストを行っていましたが、セグメンテーションエラーが表示されていました。詳細はなく、混乱しています。しかし、の配列はここで動作しません。なぜなら、デバッグ時には、配列を取り出す/印刷しようとするまで、すべてが問題ないからです。それはここで粉砕され、壊れていると報告している。それが壊れると私はここで何もすることができず、休憩したり続ける。私が続けるとうまくいく。私は本当に混乱しました。動的に割り当てられた配列を逆転させるプログラムのセグメンテーションフォルト

私のコンピュータはWindows 7です。私はvisual studio 2010 C++でコードを実行します。 デバッグは問題を解決するためにはっきりしていません。私は非常に効率的ではないC++を学んでいます。 アレイは動的割り当てが必要です。

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 
void reverseArray(int size, int num[]) { 
    if(size>1) { 
     int *p = &num[size-1]; 
     int *f = num; 
     for(int i = 0;i < size/2; i++){ 
      swap(*p, *f); 
      p--; 
      f++; 
     } 
    } 
} 

int main() { 
    int len; 
    int a[len];/This is the bug, can't use uninitialized var assign array/ 
    cin >> len; 
    for(int i = 0; i < len; i++){ 
     cin >> a[i]; 
    } 
    reverseArray(len, a); 
    for(int i = 0; i < len; i++){ 
     cout << a[i] << " "; 
    } 
    return 0; 
} 

これは動的割り当てには何かがあります。私がJavaで作業するときは、新しい配列を作成します。 私は、私はとても幸せれ、この問題が解決され、

int[] newArray = {2,4,1,2,3}; 

または最後に

int[] newArray = new int[] {2,4,1,2,3}; 

に持っています。 読み書きは非常に重要です。コーディングも重要です。 ありがとうございました。

の代わりに、配列を使用しています。 これは簡単でしょう。

#include <cstdio> 
#include <vector> 
#include <iostream> 
using namespace std; 
int main() { 
    int a; 
    int len; 
    vector<int> myvector; 
    cin >> len; 
    for(int i = 0; i < len; i++){ 
     cin >> a; 
     myvector.push_back(a); 
    } 
    reverse(myvector.begin(), myvector.end()); 
    for(int i = 0; i < len; i++){ 
     cout << myvector[i] << " "; 
    } 
    return 0; 
} 

再びアレイを使う(は、私は次のコード疑う):

#include<iostream> 
//#include<cstdlib> 
using namespace std; 

void reverseArray(int size, int nums[]){ 
    if(size > 1){ 
     int *p = &nums[size-1]; 
     int *q = nums; 
     for(int i = 0; i< size/2; i++){ 
      swap(*p, *q); 
      p--; 
      q++; 
     } 
    } 
} 

int main(){ 
    int len; 
    cin >> len; 
    int *a = new int[len];//a point to the first ele. 

    for(int i = 0; i< len; i++){ 
     cin >> a[i]; 
    } 
    reverseArray(len, a); 
    for(int i = 0; i < len; i++){ 
     cout << a[i] << " "; 
    } 
    delete [] a; 
    return 0; 

} 

それはポインタであるため、混乱して私のラップトップ上で完璧に働いたが、私は次のようにそれを使用しますアレイ。それは動作してはならない......

ファイナルアレイのバージョン: http://ideone.com/ZMsD35 完了しました。

#include<iostream> 
using namespace std; 

int main(){ 
    int len; 
    cin >> len; 
    int *a = new int[len]; 
    for(int i = 0; i< len; i++){ 
     cin >> a[i]; 
    } 
    reverse(a, a+len); 
    for(int i = 0; i< len; i++){ 
     cout << a[i]; 
    } 
    delete [] a; 
    system("pause"); 
    return 0; 

} 
+1

コメントが拡張議論のためではありません。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/129268/discussion-on-question-by-r-mia-segmentation-fault-in-a-program-that-reverses- a)。 –

答えて

0

おそらくsegfaultの理由は入力です。テストソフトウェアは、自動ストレージ領域をオーバーフローするのに十分な大きさのlen通過すると、あなたのプログラムは、このライン上でクラッシュ:

int a[len]; 

lenの正確な値はシステムに依存するが、1,000,000の入力がほとんどでそれを行う必要があります一般的なシステム。

修正は本当に簡単です - これはむしろ自動メモリよりも、ダイナミックメモリ内のデータを配置します

int a* = new int[len]; 

で宣言を交換してください。また、C++の可変長配列は標準への拡張であるため、プログラムを標準に準拠させます。

あなたはメモリリークを避けるために行われたらaを削除することを忘れないでください:

delete[] a; 
+0

こんにちは、ありがとう!それは今働いている、私はキーの2つの行の違いを知っているかもしれない?すべてのポインタを削除する必要がありますか? – flowera

+0

@ R.miaこれは、自動メモリ(スタック)からダイナミックメモリ(ヒープ)へのデータの配置を変更します。 – dasblinkenlight

+0

関連ドキュメントまたはリンクが何であるか分かりますか?/ – flowera

関連する問題