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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
_ya
0 / 0 / 0
Регистрация: 14.08.2008
Сообщений: 19
#1

Почему вылетает эксепшн? - C++

07.07.2010, 21:33. Просмотров 1087. Ответов 16
Метки нет (Все метки)

Товарищи, подскажите, почему вылетает эксепшн?

char *p = "qwerty";
p[1] = 'a';

Потому что p указывает на константное выражение "qwerty"? Пытался избавиться от константности приведением типов при помощи const_cast<char*>... Не помогает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2010, 21:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему вылетает эксепшн? (C++):

Почему вылетает - C++
Почему вылетает после того как вводишь position??? #include &lt;iostream.h&gt; enum Etype {laborer, secretary, manager, accountant,...

Почему программа вылетает - C++
Здраствуйте, почему, когда пишу: unsigned char* p = new unsigned char; программа НЕ вылетает, а когда пишу: unsigned char p; ...

почему вылетает из программы? - C++
почему вылетает из программы во время рассчета длины массива? всю голову слома, не могу найти ошибку помогите пожалуйста //файл...

Строка (почему вылетает программа?) - C++
Подскажите пожалуйста почему вылетает программа, вроде всё правильно написано. Вылетает на строчке string = string; # include...

Почему вылетает программа на delete [] - C++
Здравствуйте, подскажите, пожалуйста, что именно не так и как исправить. Программа вылетает сразу же на деструкторе,т.е на delete . Хотя,...

При запуске вылетает,а почему? - C++
#include &lt;iostream&gt; using namespace std; const int MAX=100; //ìàêñèìàëüíîå êîëè÷åñòâî ñèìâîëîâ â èìåíè class emloyee { long...

16
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
07.07.2010, 21:39 #2
Например, можно char *p = strdup("qwerty");
0
MikeSoft
Эксперт С++
3801 / 1777 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
07.07.2010, 21:51 #3
_ya, выделите память:
C++
1
2
3
char *p = new char[strlen("qwerty")+1];
strcpy(p,"qwerty");
p[1] = 'a';
0
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
07.07.2010, 22:03 #4
MikeSoft, в вашем варианте завершающий нулевой символ окажется за пределами выделенной памяти.
1
MikeSoft
Эксперт С++
3801 / 1777 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
07.07.2010, 22:12 #5
Хохол, спасибо. Опечатался. Исправил.
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
07.07.2010, 23:03 #6
Цитата Сообщение от _ya Посмотреть сообщение
Товарищи, подскажите, почему вылетает эксепшн?
char *p = "qwerty";
p[1] = 'a';
странно, а в какой части программы объявлено, если вне подпрограммы, то возомжно(это определяет где будет храниться строка), а так gcc не жалуется
ну если чо, то

char p[] = "qwerty";
p[1] = 'a';
1
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
07.07.2010, 23:08 #7
А мы тут извращаемся
0
_ya
0 / 0 / 0
Регистрация: 14.08.2008
Сообщений: 19
08.07.2010, 17:20  [ТС] #8
Спасибо за ответы! Как по другому сделать я знаю и сразу переделал, чтоб работа шла, а то сроки проекта поджимают как всегда... но вот вопрос-то остался: ПОЧЕМУ не работает? И сам не знаю как ответить, хотя пример простейший.
Компилятор vs2005, может это его хитрости, если alex_x_x говорит, что gcc не жалуется. GCC к сожалению нет, проверить не могу.
0
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
08.07.2010, 17:28 #9
Ну ваще "что-нибудь" - имеет тип const char[количество символов+1], на то он и конст, чтоб не изменяли его. Но вот каким-то компиляторам пофиг.
1
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
08.07.2010, 17:29 #10
Потому, что "qwerty" - это строковый литерал, константа, и его компилятор волен расположить в read-only memory. Разумеется, попытка записи в RO память завершится с Access Violation. Странно, если бы было иначе.....
Кстати, правильно писать const char *p = "qwerty"; Но компиляторы, к сожалению, в целях совместимости со старым кодом, допускают и первоначальное объявление....
2
MikeSoft
Эксперт С++
3801 / 1777 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
08.07.2010, 17:40 #11
_ya, RAD Studio 2010 тоже выполнила без ошибок.
Чем вы пользуетесь? И каков тип сборки?
0
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,193
Записей в блоге: 27
09.07.2010, 10:17 #12
Цитата Сообщение от _ya Посмотреть сообщение
ПОЧЕМУ не работает?
Почитай тут
Изменить значение указателя

Почему работает вариант alex_x_x почитай тут
Чем по умолчанию инициализируется символьный массив?
1
_ya
0 / 0 / 0
Регистрация: 14.08.2008
Сообщений: 19
09.07.2010, 21:00  [ТС] #13
CheshireCat, то что "qwerty" - это строковый литерал, константа знаю, посему и написал:
Цитата Сообщение от _ya Посмотреть сообщение
Пытался избавиться от константности приведением типов при помощи const_cast<char*>... Не помогает
Но компилятор, когда формирует объектные файлы видит же, что я избавляюсь от константности:
char *p1=const_cast<char*>(p);
p1[1] = 'a';
И все равно выдавал ошибку доступа. Это меня несколько озадачило. Опять же читая тему по ссылке, выданной Evg :
Изменить значение указателя
============================================================================
[QUOTE=Evg;165013]когда пишешь

Код C
1 char *p = "abc";

то семантически это соовтествует конструкции

Код C
1 static const char __t[4] = { 'a', 'b', 'c', '\0' };
2 char *p = (char*) &__t[0];

Таким образом p[1] (что эквивалентно *(p+1)) соотвествует элементу __t[1], а объект __t помечен модификатором const.
========================================================================

получается, что все должно работать. Может я туплю и занудствую, но не до конца ясный вопрос покоя не дает

Добавлено через 20 минут
Цитата Сообщение от MikeSoft Посмотреть сообщение
_ya, RAD Studio 2010 тоже выполнила без ошибок.
Чем вы пользуетесь? И каков тип сборки?
Пользуюсь VS2005 Professional. Пару лет назад начал с нее, так и юзаю, все вроде нравится и с QT она хорошо работает в отличие от 2008, с которой как-то QT не подружилась у меня...
0
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 21:16 #14
_ya, это особая константа, все строковые литералы хранятся отдельно, их изменять нельзя. Можно сравнить это с попыткой изменить числовой литерал. Вы же используете указатель. Рекомендую внимательно почитать вот этот пост. Ну и вообще посмотреть этот топик.
1
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,193
Записей в блоге: 27
09.07.2010, 23:38 #15
Цитата Сообщение от _ya Посмотреть сообщение
Может я туплю и занудствую, но не до конца ясный вопрос покоя не дает
Глобальные переменные с модификатором const размещаются в специальных read-only сегментах памяти, а потому при записи в такие участки памяти происходит прерывание
1
09.07.2010, 23:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2010, 23:38
Привет! Вот еще темы с ответами:

Вылетает программа. Не пойму, почему? - C++
Здравствуйте. Написал прогу на С++ - это лаба по ООП. Но она вылетает. Не пойму почему! // объявление класса Date #include &lt;iostream&gt; ...

Программа на С++ вылетает, не могу понять почему!? - C++
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;allegro.h&gt; #include &lt;math.h&gt; #include &lt;time.h&gt; #define W...

Почему вылетает ошибка Heap corruption detected - C++
Добрый вечер. Ошибка вылетает на строке 870 в файле Lexical_unit.cpp, когда происходит попытка изменить значение переменной,...

C++ почему прога вылетает, не успеваю посмотреть действие - C++
дан массив строк, если какая либо строка заканчивается буквой k, то удалить эту строку, вод что я написал: #include &lt;iostream.h&gt; ...


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

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

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