@comradegoryaev

Почему появляется System.AccessViolationException в Visual Studio 2010?

Есть такой код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
using namespace System;

void reverse (char * str, int count = 0);

int main(array<System::String ^> ^args)
{
	char * str = "Hello";
	reverse (str, 3);
	cout<<str;
    _getch();
    return 0;
}
void reverse (char * str, int count)
{
	char temp;
	if (count == 0) 
		count = strlen(str) - 1; 
	for (int i = 0, j = count; i < j; i++, j--)
	{
		temp = str[i];
		str[i] = str[j];
		str[j] = temp;
	}	
}

reverse() записывает в str первые count символов в обратном порядке, если count не указан или равен нулю, то используется вся строка. После строки "str[i] = str[j];" появляется System.AccessViolationException.
Это не первый вариант кода этой функции. В первом варианте, я динамически создавал массив char и записывал в него str наоборот, но при копировании его обратно в str (через strcpy()) вылетало то же самое исключение.
Это пример из книги Шилдта "Самоучитель С++", этот вариант написан в книге. Я начинаю думать, что проблема именно в VS.

UPD. Также у меня и раньше вылетало это исключение при работе с массивами char, выделенными с помощью new в VS, хотя казалось, что должно работать. Ответа на свой вопрос я в интернетах не нашел, в основном люди неправильно выделяли память, либо не выделяли вообще.
  • Вопрос задан
  • 3530 просмотров
Решения вопроса 1
@vilgeforce
Раздолбай и программист
Попробуйте char * str = "Hello"; заменить на char str[] = "Hello";
Подозреваю, что строка "Hello" при сборке помещается в секцию без прав на запись, вы этот указатель используете и пытаетесь в ту самую RO область писать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AxisPod
@AxisPod
Зачем здесь .NET вообще? Зачем вообще вы создаете проекты C++/Cli, если вам это не надо? Зачем вам CLR проект, делайте Win32, тогда понять вас будет проще и как бы не будут вылетать ошибки непонятные вам. Что-то слабо верится, что в указанной вами книге просят создавать CLR проекты. А с переводами на Русский частая проблема, так это множество опечаток.
Ответ написан
Комментировать
@Sumor
Ошибка в строке
if (count == 0)
Нужно
if (count != 0)
В целом ещё несколько замечаний, но по вопросу именно так.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы