Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
#1

EAccessViolation, если длина строки больше 14 - C++

21.02.2013, 20:30. Просмотров 350. Ответов 4
Метки нет (Все метки)

Здравствуйте! Сперва простой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void cyr_print(const char* text)
{
    const int n = strlen(text);
    char *buf = new char[n];
    CharToOem(text, buf);
    cout<<buf<<endl;
    delete buf;
}
//---------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
    char *arr1 = new char[0];
    char *arr2 = new char[0];
    cyr_print("Введите первую строку: ");
    cin>> arr1;
    cyr_print("Введите вторую строку: ");
    cin>> arr2;
    delete arr1;
    delete arr2;
 
    system("pause");
    return 0;
}
Если вводить в консоли до 15 символов в каждый массив, то все работает, если 15 и больше, то ошибка.
Мне интересно, почему именно 15? при этом мы можем на самом деле ввести хоть 30, и все будет норм, программа вылетит только после строчки

C++
1
return 0;
Как так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2013, 20:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос EAccessViolation, если длина строки больше 14 (C++):

Определить длину введенной строки, и, если длина больше заданной, то удалить символы от a до z - C++
Здравствуйте можете пожалуйста помочь с задачей на строки. Очень прошу. Определить длину введенной строки, и, если длина больше 15, то...

Если длина строки больше 10 - оставить первые 6 символов, иначе дополнить строку символами 'о' - C++
Дана строка.Если ее длина больше 10,то оставить в строке только первые 6 символов,иначедополнить строку символами 'о' до длины 12.

Если длина введенной строки кратна 4, первую часть строки поменять местами со второй - C++
Если длина введенной строки кратна 4, первую часть строки поменять местами со второй.

Удалить из строки среднюю букву, если длина строки нечётная или две средних в противном случае - C++
Строки. Дана строка S. Удалите из неё среднюю букву, если длина строки нечётная или две средних в противном случае. Формат входных...

Вывести на консоль те строки, длина которых меньше (больше) средней, а также длину. - C++
Собственно вот проблема..Мне помогали писать данную программу но она что-то все равно не работает. Она просто тупо зависает. Может кто...

Если длина строки меньше заданной, то повторить ввод - C++
есть массив из длины 21 елемент, надо зделать проверку, если длина &gt; заданой повторить ввод. #include &lt;string&gt; #include &lt;iostream&gt; ...

4
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.02.2013, 21:23 #2
Потому что вот что говорит стандарт: 3.7.3.1/2
The allocation function attempts to allocate the requested amount of storage. If it is successful, it shall
return the address of the start of a block of storage whose length in bytes shall be at least as large as the
requested size
.
Поэтому ниже есть еще такое
Even if the size of the space requested is zero, the request can fail.
То есть даже на 0 может не хватить места, например.

Ну и еще
The effect of dereferencing a pointer returned as a request for zero size is undefined
В твоем случае, скорее всего, система отдала 16 байт (15 символов + '\0' строки)
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
21.02.2013, 23:21  [ТС] #3
Хм ... а почему система несмотря на выделение только 16 байт, все равно может записать туда больше? Т.е. получается, что записать она может, но возникают проблемы при закрытии программы при освобождении памяти? Т.е. с одной стороны функция strlen(), например, видит реальный размер, но при закрытии все равно что-то недоудаляется? где-то утечка?
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.02.2013, 23:30 #4
а кто ей помешает? Ты же не можешь знать из какой кучи она достала эту память. Если ты под окнами, то система берет из кучи процесса (HeapAlloc(GetProcessHeap(), ...)), например; Обычно эта куча не ограничивается десятками байт. При выходе и проверке обнаруживается нарушение, о чем тебе и сообщается.

или ты можешь использовать бибилиотеку, где new переписан под свои менеджеры памяти...

На самом деле ситуация тут такая, что так сразу и не скажешь, что может произойти, а чего не может. Это зависит не только от компилятора, но и от рантайма, системы, режима сборки, положения звезд, пятен на солнце ...

Кстати, отвлеченно от памяти, у тебя еще одна неприятность есть в коде
C++
1
2
3
4
5
    char *arr1 = new char[0];
    char *arr2 = new char[0];
....
    delete arr1;
    delete arr2;
Если ты используешь new [], то должен использовать delete [] для удаления.
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
23.02.2013, 23:46  [ТС] #5
Ах да ... позабыл поставить квадратные скобки)
Да, это под Win, c++ builder.
Причем я заметил такую особенность, что, когда мы только создали переменную, там лежит только один символ '\0', а как только добавляем хоть один элемент, массив автоматом расширяется до 16, включая символ конца строки, конечно.
Проблема (т.е EAccessViolation) исчезает, только если мы ручками определяем размер массива.
Но тут вопрос: зачем тогда выделяется эта память, если при таком её использовании все заканчивается ошибкой?
Причем, если мы выделили память для 7 элементов и используем strlen, то он покажет 7, хотя на самом деле там ведь 16! И мы можем посмотреть содержимое этих 16 элементов. Видимо в памяти хранится ещё кучка дополнительной инфы, какие элементы массива доступны, а какие как бы и есть, но и их и использовать нельзя ... даже можно, но будет ошибка потом. Но на вопрос зачем это не отвечает ...
0
23.02.2013, 23:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2013, 23:46
Привет! Вот еще темы с ответами:

Если длина строки четная, то удалить подстроку до первого пробела - C++
Помогите, пожалуйста, найти и исправить ошибку, ибо я уже не знаю что не так. Задача должна удалить подстроку до первого пробела, если...

появилась загвоздка с функцией. нужно вывести на экран строку, сост. из звездочек. Длина строки-параметр функциииз звезд. длина строки - - C++
Я видела, что на форуме есть подобные задачи, но ни одно из их решений не работает на моем dev cpp.:( вот вариант решения, но он не...

Как считать строки из файла, если там больше одной строки? - C++
Как считать строки из файла в массив. Если в файле одна строка, то нет проблем, но если несколько, то при использовании функции fgets ...

Программа должна определить длину введенной строки L и, если длина L >15, то удаляются все a..z. - C++
27. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши &quot;Ввод&quot;. Программа должна определить длину...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.