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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
_ya
0 / 0 / 0
Регистрация: 14.08.2008
Сообщений: 19
07.07.2010, 21:33     Почему вылетает эксепшн? #1
Товарищи, подскажите, почему вылетает эксепшн?

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

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

C++ При запуске вылетает,а почему?
C++ почему вылетает из программы?
C++ Почему вылетает
C++ непонятно почему вылетает
C++ Почему программа вылетает
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
07.07.2010, 21:39     Почему вылетает эксепшн? #2
Например, можно char *p = strdup("qwerty");
MikeSoft
Эксперт C++
 Аватар для MikeSoft
3782 / 1766 / 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';
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
07.07.2010, 22:03     Почему вылетает эксепшн? #4
MikeSoft, в вашем варианте завершающий нулевой символ окажется за пределами выделенной памяти.
MikeSoft
Эксперт C++
 Аватар для MikeSoft
3782 / 1766 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
07.07.2010, 22:12     Почему вылетает эксепшн? #5
Хохол, спасибо. Опечатался. Исправил.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
07.07.2010, 23:03     Почему вылетает эксепшн? #6
Цитата Сообщение от _ya Посмотреть сообщение
Товарищи, подскажите, почему вылетает эксепшн?
char *p = "qwerty";
p[1] = 'a';
странно, а в какой части программы объявлено, если вне подпрограммы, то возомжно(это определяет где будет храниться строка), а так gcc не жалуется
ну если чо, то

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

Почему работает вариант alex_x_x почитай тут
Чем по умолчанию инициализируется символьный массив?
_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 не подружилась у меня...
Demihalf
Унылый школьник
 Аватар для Demihalf
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 21:16     Почему вылетает эксепшн? #14
_ya, это особая константа, все строковые литералы хранятся отдельно, их изменять нельзя. Можно сравнить это с попыткой изменить числовой литерал. Вы же используете указатель. Рекомендую внимательно почитать вот этот пост. Ну и вообще посмотреть этот топик.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
09.07.2010, 23:38     Почему вылетает эксепшн? #15
Цитата Сообщение от _ya Посмотреть сообщение
Может я туплю и занудствую, но не до конца ясный вопрос покоя не дает
Глобальные переменные с модификатором const размещаются в специальных read-only сегментах памяти, а потому при записи в такие участки памяти происходит прерывание
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,670
10.07.2010, 00:29     Почему вылетает эксепшн? #16
Согласно стандарту, при попытке снять константность оператором const_cast и изменить объект, изначально созданный как const, поведение программы не определено. Эти действия возможны только для объекта, на который константность была навешена уже после создания.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2010, 16:13     Почему вылетает эксепшн?
Еще ссылки по теме:

Почему при вводе данных вылетает ошибка C++
Программа на С++ вылетает, не могу понять почему!? C++
Строка (почему вылетает программа?) C++

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

Или воспользуйтесь поиском по форуму:
_ya
0 / 0 / 0
Регистрация: 14.08.2008
Сообщений: 19
12.07.2010, 16:13  [ТС]     Почему вылетает эксепшн? #17
Пасиба, парни, разобрался.
Yandex
Объявления
12.07.2010, 16:13     Почему вылетает эксепшн?
Ответ Создать тему
Опции темы

Текущее время: 05:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru