2017-01-20 7 views
-1

У меня ошибка: «Необработанное исключение в 0x00d23737 в 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

Вы должны провести некоторое время правильно обучение 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