2017-01-20 46 views
-1

我得到了錯誤:「在Test.exe 0x00d23737未處理的異常: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

你需要花一些時間學習正確C++。這裏顯示的代碼包含一些相當重要的語法錯誤。 – 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次迭代中,Index會增加超過Initialization_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,使你的代碼更難解釋爲其他用戶(「string自定義類型或std::string」)

+0

非常感謝,你的回答非常有幫助,我真的很感謝你的時間, – Abdelrahman

相關問題