Форум программистов, компьютерный форум CyberForum.ru

Access violation и размерность символьного массива - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
03.06.2012, 02:13     Access violation и размерность символьного массива #1
Всех приветствую!
Только начинаю работать с консолькой, и вот уже возникли непонятки с символьными массивами.

Конкатенирую 2 введенные строчки через разделитель " - ":

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
 
#include <string.h>
 
int main(int nNumberofArgs, char* pszArgs[])
{
    char szString1[256];
    cout << "Enter string #1:";
    cin >> szString1;
 
    char szString2[20];
    cout << "Enter string #2:";
    cin >> szString2;
 
    strcat(szString1, " - ");
 
    strcat(szString1, szString2);
 
    cout << "\n" << szString1 << "\n";
 
    system("PAUSE");
    return 0;
}
Когда во вторую строчку ввожу ровно заданное кол-во символов (т.е. 20) , то на
C++
1
    strcat(szString1, szString2);
Выдается access violation. Почему - не понимаю. Есть предположение, что strcat у szString2 ищет нулевой символ по индексу [20+], а нарывается на закрытый блок.
Но почему я должен заботиться об этом нулевом символе и плюсовать дополнительно еще один символ в размерности для этого нулевого символа?

Хотя, наверное, мое предположение об 0-ом символе неверно. Тогда что же это?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2012, 02:13     Access violation и размерность символьного массива
Посмотрите здесь:

C++ Access violation
Ошибка Access Violation C++
C++ Crash (access violation)
C++ access violation at address
C++ не пойму из-за чего Access violation
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 00:20  [ТС]     Access violation и размерность символьного массива #41
Avazart, что-то запутался... Это который скрин?)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
05.06.2012, 00:29     Access violation и размерность символьного массива #42
Сообщение #26 скрин №1
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 00:33  [ТС]     Access violation и размерность символьного массива #43
Avazart, хм... а почему так происходит, если убрать cin?
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
05.06.2012, 00:49     Access violation и размерность символьного массива #44
Ну по тому что записывается "abcde\0\0\0\0\0....\0" (как сказано в цитате).
а в во вторую строку "0123456789" без \0. но как сказано в цитате это зависит от компилятора
т.е вероятно может быть в первой строке записалось "abcde\0??????" по тому и мусор

Добавлено через 11 минут
Вприципе чего гадать- можно просто поэксперементировать
Миниатюры
Access violation и размерность символьного массива  
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 00:58  [ТС]     Access violation и размерность символьного массива #45
Avazart, о, значит получается у второй строки сразу после введенных символов оказался /0? Но это же не наш нулевой символ, а просто рандомный мусор - я правильно понимаю?
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
05.06.2012, 01:00     Access violation и размерность символьного массива #46
Ну да
Вот если изменить размер
Миниатюры
Access violation и размерность символьного массива  
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:02  [ТС]     Access violation и размерность символьного массива #47
Avazart, странно... А почему тут 'a' (из первой строки) вдруг на /0 перезаписалась?
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
05.06.2012, 01:03     Access violation и размерность символьного массива #48
Вторая строка могла залезть на первую... - в этом то и опасность С-строк, поэтому и советуют использовать std::string
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.06.2012, 01:11     Access violation и размерность символьного массива #49
При вводе строки автоматически записывается ноль символ в конце. При вводе 20 символов он просто пишется за пределы массива, в данном случае в str[20];
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:14  [ТС]     Access violation и размерность символьного массива #50
Avazart, и как-то
Цитата Сообщение от The_Immortal Посмотреть сообщение
не наш нулевой символ, а просто рандомный мусор
уж очень подозрительно встает сразу после ввода... Что-то на рандомность мало смахивает. Может быть это все-таки наш ентер? Хотя откуда ему там взяться, когда массив заполнен.

В общем, какой-то хитрый рандом).

Добавлено через 42 секунды
Toshkarik,
Цитата Сообщение от The_Immortal Посмотреть сообщение
Может быть это все-таки наш ентер?
Цитата Сообщение от Toshkarik Посмотреть сообщение
При вводе строки автоматически записывается ноль символ в конце.
О! Это точно? Ну тогда возвращаемся... К... Да собственно к первой мессаге моей - как тогда объясните AV, если на str[20] у меня записался /0.

Добавлено через 2 минуты
Цитата Сообщение от Toshkarik Посмотреть сообщение
При вводе строки автоматически записывается ноль символ в конце.
И кстати, если не секрет, откуда такая инфа?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.06.2012, 01:16     Access violation и размерность символьного массива #51
Enter это символ новой строки '\n', он никак не относится к данной операции. Просто так реализована перегрузка оператора >> на ввод строки. При
C++
1
cin >> str;
вызывается перегруженная функция std::istream &operator>>( std::istream &, char *str ); Прототип может конечно иметь немного другой вид, но суть думаю должна быть понятна. cin и cout это всего лишь объекты класса istream и ostream соответственно.
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:20  [ТС]     Access violation и размерность символьного массива #52
Toshkarik,

Цитата Сообщение от Toshkarik Посмотреть сообщение
Enter это символ новой строки '\n', он никак не относится к данной операции
Согласен. Это я фигню сказал.

Дык все-таки почему в моем случае возникает тогда Access Violation, если в конце szString2 записывается /0? По ячейке szString2[20]. И должно быть все норм впоследствии... А возникает AV.

М?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.06.2012, 01:21     Access violation и размерность символьного массива #53
Цитата Сообщение от The_Immortal Посмотреть сообщение
И кстати, если не секрет, откуда такая инфа?
Из книг и логики, откуда же еще
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
05.06.2012, 01:22     Access violation и размерность символьного массива #54
Проверяем...
Миниатюры
Access violation и размерность символьного массива  
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.06.2012, 01:23     Access violation и размерность символьного массива #55
С чего это норм? Данные записываются за пределы массива, на что и указывает ошибка. Я думаю, что просто реализация исключений у всех компиляторов разная.
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:27  [ТС]     Access violation и размерность символьного массива #56
Avazart, чего-то не понял... Вы перезаписал \0 получается? И что это нам дает?


Toshkarik,
Цитата Сообщение от Toshkarik Посмотреть сообщение
Данные записываются за пределы массива, на что и указывает ошибка
Так ошибка возникает не на записи данных за пределы массива...
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.06.2012, 01:28     Access violation и размерность символьного массива #57
А на чем? На чтении? Это в принципе без разницы. Просто сам факт доступа к данным за пределы массива вызывает исключение в функции strcat().
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
05.06.2012, 01:31     Access violation и размерность символьного массива #58
Avazart, чего-то не понял... Вы перезаписал \0 получается? И что это нам дает?
Как что?
Мы видем что второй массив залезает на первый и затерает его.
Миниатюры
Access violation и размерность символьного массива  
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:44  [ТС]     Access violation и размерность символьного массива #59
Toshkarik,
Цитата Сообщение от Toshkarik Посмотреть сообщение
А на чем? На чтении? Это в принципе без разницы.
Смотрите. Вот происходит запись этого нулевого символа за пределы массива - никто не ругается почему-то.

Но если ниже использовать strcat, которая будет считывать из этой строчки, то почему-то возникает ошибка, хотя она должна дойти до этого знака '^' и успокоиться...
Миниатюры
Access violation и размерность символьного массива  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2012, 01:49     Access violation и размерность символьного массива
Еще ссылки по теме:

access violation reading location C++
C++ Сортировка слиянием и Access Violation
Что делать? Access violation C++

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

Или воспользуйтесь поиском по форуму:
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:49  [ТС]     Access violation и размерность символьного массива #60
Чего-то пипец у меня каша в голове теперь...
Yandex
Объявления
05.06.2012, 01:49     Access violation и размерность символьного массива
Ответ Создать тему
Опции темы

Текущее время: 01:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru