Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891

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

03.06.2012, 02:13. Показов 6044. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.06.2012, 02:13
Ответы с готовыми решениями:

Access violation. Выход за границы массива
Пытаюсь заполнить структуру считывая информацию из файла, но после компиляции при открытии программы выводится сообщение об ошибке, никак...

Access Violation при обращении к элементу массива
Пытаюсь написать одну занятную карточную игру, но еще на стадии описания колоды(точней при его переводе из консоли в приложение с формами)...

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

76
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 00:20  [ТС]
Студворк — интернет-сервис помощи студентам
Avazart, что-то запутался... Это который скрин?)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2012, 00:29
Сообщение #26 скрин №1
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 00:33  [ТС]
Avazart, хм... а почему так происходит, если убрать cin?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2012, 00:49
Ну по тому что записывается "abcde\0\0\0\0\0....\0" (как сказано в цитате).
а в во вторую строку "0123456789" без \0. но как сказано в цитате это зависит от компилятора
т.е вероятно может быть в первой строке записалось "abcde\0??????" по тому и мусор

Добавлено через 11 минут
Вприципе чего гадать- можно просто поэксперементировать
Миниатюры
Access violation и размерность символьного массива  
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 00:58  [ТС]
Avazart, о, значит получается у второй строки сразу после введенных символов оказался /0? Но это же не наш нулевой символ, а просто рандомный мусор - я правильно понимаю?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2012, 01:00
Ну да
Вот если изменить размер
Миниатюры
Access violation и размерность символьного массива  
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:02  [ТС]
Avazart, странно... А почему тут 'a' (из первой строки) вдруг на /0 перезаписалась?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2012, 01:03
Вторая строка могла залезть на первую... - в этом то и опасность С-строк, поэтому и советуют использовать std::string
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.06.2012, 01:11
При вводе строки автоматически записывается ноль символ в конце. При вводе 20 символов он просто пишется за пределы массива, в данном случае в str[20];
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:14  [ТС]
Avazart, и как-то
Цитата Сообщение от The_Immortal Посмотреть сообщение
не наш нулевой символ, а просто рандомный мусор
уж очень подозрительно встает сразу после ввода... Что-то на рандомность мало смахивает. Может быть это все-таки наш ентер? Хотя откуда ему там взяться, когда массив заполнен.

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

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

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

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

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

М?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.06.2012, 01:21
Цитата Сообщение от The_Immortal Посмотреть сообщение
И кстати, если не секрет, откуда такая инфа?
Из книг и логики, откуда же еще
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2012, 01:22
Проверяем...
Миниатюры
Access violation и размерность символьного массива  
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.06.2012, 01:23
С чего это норм? Данные записываются за пределы массива, на что и указывает ошибка. Я думаю, что просто реализация исключений у всех компиляторов разная.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:27  [ТС]
Avazart, чего-то не понял... Вы перезаписал \0 получается? И что это нам дает?


Toshkarik,
Цитата Сообщение от Toshkarik Посмотреть сообщение
Данные записываются за пределы массива, на что и указывает ошибка
Так ошибка возникает не на записи данных за пределы массива...
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
05.06.2012, 01:28
А на чем? На чтении? Это в принципе без разницы. Просто сам факт доступа к данным за пределы массива вызывает исключение в функции strcat().
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2012, 01:31
Avazart, чего-то не понял... Вы перезаписал \0 получается? И что это нам дает?
Как что?
Мы видем что второй массив залезает на первый и затерает его.
Миниатюры
Access violation и размерность символьного массива  
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:44  [ТС]
Toshkarik,
Цитата Сообщение от Toshkarik Посмотреть сообщение
А на чем? На чтении? Это в принципе без разницы.
Смотрите. Вот происходит запись этого нулевого символа за пределы массива - никто не ругается почему-то.

Но если ниже использовать strcat, которая будет считывать из этой строчки, то почему-то возникает ошибка, хотя она должна дойти до этого знака '^' и успокоиться...
Миниатюры
Access violation и размерность символьного массива  
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
05.06.2012, 01:49  [ТС]
Чего-то пипец у меня каша в голове теперь...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2012, 01:49

Access Violation при повторном заполнении динамического массива
Здравствуйте, есть код парсинга некоторой информации с сайта. type RRecord = record id:integer; img_url:string;...

Access Violation at address. при записи в StringGrid двумерного массива
Пожалуйста, подскажите в чем здесь дело. Пытался реализовать сложение матриц. Button2 нужна для решения другой задачи, прошу не обращать...

Ошибка 'Access violation at address 00403EF4' при вводе массива
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...

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

Обращение к элементам массива порождает ошибку "Access violation"
type Tarec=^color; Arec = record number : integer; Position : Integer; end; Zap : array of Tarec; ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru