2017-01-20 28 views
-1

エラーが発生しました: "未処理例外、Test.exe:0xC0000005:アクセス違反の読み取り場所0x8a8c0344"これは、コード次未処理例外*****アクセス違反の読み取り場所*******

int main(int argc, char* argv[]) 
{ 
string My_String_Array[30720]; 
Initialize_My_String_Array (My_String_Array); //i really doubt that there is something wrong in the definition of this function 
for (int i=0;i<=30719;i++) 
    { 
    cout<<My_String_Array[i]<<endl; 
    } 
system("pause"); 
return 0; 
} 

Initialize_My_String_Array(のコード)は以下の通りである:

void Initialize_My_String_Array (My_String_Array[30720]) 
{ 
    string Initialization_Values[]={"A","B","C","D","E"}; 
    int Index=0; 
    int i=0; 
    int j=0; 
    while (i<=30719) 
     { 

      My_String_Array[i]=Initialization_Values[Index]; 
      i++; 
      j++; 
      if (j=6144) 
       { 
       j=0; 
       Index++; 
       } 
     } 

任意の考えは理解されるであろう。

+0

のために解釈するコードが難しくなります。ここに表示されるコードには、かなり重大な構文エラーが含まれています。 – Xirema

+0

2つの配列がアクセスされています - どちらが問題になっていますか? – UKMonkey

+0

@ Xiremaはあなたの答えに感謝しますが、あなたは何が構文エラーですか? – Abdelrahman

答えて

5

コードには、特にInitialize_My_String_Arrayに多くの問題があります。

void Initialize_My_String_Array (My_String_Array[30720]) 
{ 
    string Initialization_Values[]={"A","B","C","D","E"}; 
    int Index=0; 
    int i=0; 
    int j=0; 
    while (i<=30719){ 
     My_String_Array[i]=Initialization_Values[Index]; 
     i++; 
     j++; 
     if (j=6144){ 
      j=0; 
      Index++; 
     } 
    } 
} 
  1. あなたのメソッドのシグネチャが正しくありません。変数My_String_Array[30720]を宣言しましたが、その型を指定していません。文脈から、タイプはstd::stringであると考えられます。
  2. ifの文では、if(j = 6144)と書いてあります。 =は等価演算子ではなく、代入演算子です。 ==は等価演算子です。あなたのコードでは、6144をjに割り当ててから、ゼロ以外の値をブール値に昇格させると、ifステートメントが常に実行されます。つまり、Indexは常に増加します。ループの5回の反復の中でIndexInitialization_Valuesのサイズを超えて増加し、未定義の動作が発生し、場合によってはアクセス違反が発生します。コンテキストに基づいて

、私は修正されたコードは次のようになりますと思う:この向こう

//Type is now correctly defined. 
void Initialize_My_String_Array (string My_String_Array[30720]) 
{ 
    string Initialization_Values[]={"A","B","C","D","E"}; 
    int Index=0; 
    int i=0; 
    int j=0; 
    while (i<=30719){ 
     My_String_Array[i]=Initialization_Values[Index]; 
     i++; 
     j++; 
     if (j == 6144){ 
      j=0; 
      Index++; 
     } 
    } 
} 

、あなたはこのコードを書いた方法を見直し、いくつかの時間を費やす必要があります。 Cスタイルの配列は、一般的にC++での悪い習慣とみなされています。なぜなら、あなたのコードは理由についての完璧なケーススタディです。 C++ std::arrayオブジェクトははるかに優れており、このようなコードでは優先する必要があります。さらに、インデックスと配列境界を含むスパゲッティコードに夢中になりました。それを扱うもっと良い方法があります。

void Initialize_My_String_Array (std::array<std::string, 30720> & My_String_Array) 
{ 
    const std::array<std::string, 5> Initialization_Values{"A","B","C","D","E"}; 
    const size_factor = (My_String_Array.size()/Initialization_Values.size()); 
    for(size_t index = 0; index < My_String_Array.size() && (index/size_factor) < Initialization_Values.size(); index++) { 
     My_String_Array[index] = Initialization_Values[index/size_factor]; 
    } 
} 

int main(int argc, char* argv[]) { 
    std::array<std::string, 30720> My_String_Array; 
    Initialize_My_String_Array (My_String_Array); 
    for(std::string const& s : My_String_Array) { 
     std::cout << s << std::endl; 
    } 
    system("pause"); 
    return 0; 
} 

もう一つ:私はこのコードのより良いバージョンであることを考えるもの書いたコード内のどこかで、あなたはusing namespace std;のようなものを書いています。それを取り除く。 It's bad practiceとあなたが適切にC++を学んでいくつかの時間を費やす必要があり、他のユーザ(「stringされたカスタムタイプやstd::string」)

+0

ありがとう、あなたの答えは非常に有用です、本当にありがとう、 – Abdelrahman

関連する問題