Задать вопрос
@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, хотя казалось, что должно работать. Ответа на свой вопрос я в интернетах не нашел, в основном люди неправильно выделяли память, либо не выделяли вообще.
  • Вопрос задан
  • 3540 просмотров
Подписаться 1 Оценить Комментировать
Ответ пользователя Sumor К ответам на вопрос (3)
@Sumor
Ошибка в строке
if (count == 0)
Нужно
if (count != 0)
В целом ещё несколько замечаний, но по вопросу именно так.
Ответ написан