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

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

03.06.2012, 02:13. Показов 5524. Ответов 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
Ответ Создать тему
Новые блоги и статьи
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru