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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
#1

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

03.06.2012, 02:13. Просмотров 2851. Ответов 76
Метки нет (Все метки)

Всех приветствую!
Только начинаю работать с консолькой, и вот уже возникли непонятки с символьными массивами.

Конкатенирую 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-ом символе неверно. Тогда что же это?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2012, 02:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Access violation и размерность символьного массива (C++):

Access violation при выводе массива через функцию - C++
Приветствую вас, прошу помощи в объяснении что же не так.(В частности проблема с указателями) На данный момент программа должна...

Ошибка (access violation) при обращении к элементу динамического массива структур - C++
Добрый день! Все прекрасно работает если в структуре статические массивы. Но так уж получилось, что есть необходимость задавать размерность...

Access violation - C++
Помогите пожалуйста. Не могу разобраться. Нашел в каком месте ругается. Но не понял на что именно.void __fastcall...

Crash (access violation) - C++
Задача: http://acm.timus.ru/problem.aspx?space=1&amp;num=1313 p.s. ссылку лучше откопипастить в браузер, т.к. форум на выходе её портит ...

access violation at address - C++
Дорогие форумчане, столкнулся с проблемой, читаю бинарный файл по структуре : struct HEAD { int a1; int a2; }; struct...

Ошибка Access Violation - C++
Собственно, проблемма: Есть класс, в котором есть переменные (3 шт): class wField { protected: int Vert; int Gor; char*...

76
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
05.06.2012, 01:00 #46
Ну да
Вот если изменить размер
1
Миниатюры
Access violation и размерность символьного массива  
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:02  [ТС] #47
Avazart, странно... А почему тут 'a' (из первой строки) вдруг на /0 перезаписалась?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
05.06.2012, 01:03 #48
Вторая строка могла залезть на первую... - в этом то и опасность С-строк, поэтому и советуют использовать std::string
1
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
05.06.2012, 01:11 #49
При вводе строки автоматически записывается ноль символ в конце. При вводе 20 символов он просто пишется за пределы массива, в данном случае в str[20];
0
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:14  [ТС] #50
Avazart, и как-то
Цитата Сообщение от The_Immortal Посмотреть сообщение
не наш нулевой символ, а просто рандомный мусор
уж очень подозрительно встает сразу после ввода... Что-то на рандомность мало смахивает. Может быть это все-таки наш ентер? Хотя откуда ему там взяться, когда массив заполнен.

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

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

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

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

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

М?
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
05.06.2012, 01:21 #53
Цитата Сообщение от The_Immortal Посмотреть сообщение
И кстати, если не секрет, откуда такая инфа?
Из книг и логики, откуда же еще
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
05.06.2012, 01:22 #54
Проверяем...
1
Миниатюры
Access violation и размерность символьного массива  
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
05.06.2012, 01:23 #55
С чего это норм? Данные записываются за пределы массива, на что и указывает ошибка. Я думаю, что просто реализация исключений у всех компиляторов разная.
0
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:27  [ТС] #56
Avazart, чего-то не понял... Вы перезаписал \0 получается? И что это нам дает?


Toshkarik,
Цитата Сообщение от Toshkarik Посмотреть сообщение
Данные записываются за пределы массива, на что и указывает ошибка
Так ошибка возникает не на записи данных за пределы массива...
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
05.06.2012, 01:28 #57
А на чем? На чтении? Это в принципе без разницы. Просто сам факт доступа к данным за пределы массива вызывает исключение в функции strcat().
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
05.06.2012, 01:31 #58
Avazart, чего-то не понял... Вы перезаписал \0 получается? И что это нам дает?
Как что?
Мы видем что второй массив залезает на первый и затерает его.
1
Миниатюры
Access violation и размерность символьного массива  
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:44  [ТС] #59
Toshkarik,
Цитата Сообщение от Toshkarik Посмотреть сообщение
А на чем? На чтении? Это в принципе без разницы.
Смотрите. Вот происходит запись этого нулевого символа за пределы массива - никто не ругается почему-то.

Но если ниже использовать strcat, которая будет считывать из этой строчки, то почему-то возникает ошибка, хотя она должна дойти до этого знака '^' и успокоиться...
0
Миниатюры
Access violation и размерность символьного массива  
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:49  [ТС] #60
Чего-то пипец у меня каша в голове теперь...
0
05.06.2012, 01:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2012, 01:49
Привет! Вот еще темы с ответами:

access violation reading location - C++
access violation reading location такая проблема если вести информацию про двух и больше студентов помогите пожалуйста очень срочно надо ...

Access violation writing location - C++
#include &lt;iostream&gt; using namespace std; template &lt; typename t &gt; void QuickSort( t array, int left,int right) { int i = left; ...

exception : 0xC0000005: Access Violation - C++
Разработка идет по windows mobile 6. Возникла необходимость в определенном случае менять данные в памяти по адресу 0x02020000 cо смещение...

Access violation writing location - C++
Вылетает эта ошибка. В чём может быть проблема? Программа выполняется выводит результат, а после вылетает исключение. #include...


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

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

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