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

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

03.06.2012, 02:13. Показов 5480. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru