0 / 0 / 0
Регистрация: 14.08.2008
Сообщений: 19
|
|
1 | |
Почему вылетает эксепшн?07.07.2010, 21:33. Показов 1816. Ответов 16
Метки нет (Все метки)
Товарищи, подскажите, почему вылетает эксепшн?
char *p = "qwerty"; p[1] = 'a'; Потому что p указывает на константное выражение "qwerty"? Пытался избавиться от константности приведением типов при помощи const_cast<char*>... Не помогает
0
|
07.07.2010, 21:33 | |
Ответы с готовыми решениями:
16
Почему вылетает Почему вылетает? Почему вылетает программа? Почему программа вылетает |
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
07.07.2010, 21:39 | 2 |
Например, можно char *p = strdup("qwerty");
0
|
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
||||||
07.07.2010, 21:51 | 3 | |||||
_ya, выделите память:
0
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
07.07.2010, 22:03 | 4 |
MikeSoft, в вашем варианте завершающий нулевой символ окажется за пределами выделенной памяти.
1
|
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
|
07.07.2010, 22:12 | 5 |
Хохол, спасибо. Опечатался. Исправил.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
07.07.2010, 23:03 | 6 |
странно, а в какой части программы объявлено, если вне подпрограммы, то возомжно(это определяет где будет храниться строка), а так gcc не жалуется
ну если чо, то char p[] = "qwerty"; p[1] = 'a';
1
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
07.07.2010, 23:08 | 7 |
А мы тут извращаемся
0
|
0 / 0 / 0
Регистрация: 14.08.2008
Сообщений: 19
|
|
08.07.2010, 17:20 [ТС] | 8 |
Спасибо за ответы! Как по другому сделать я знаю и сразу переделал, чтоб работа шла, а то сроки проекта поджимают как всегда... но вот вопрос-то остался: ПОЧЕМУ не работает? И сам не знаю как ответить, хотя пример простейший.
Компилятор vs2005, может это его хитрости, если alex_x_x говорит, что gcc не жалуется. GCC к сожалению нет, проверить не могу.
0
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
08.07.2010, 17:28 | 9 |
Ну ваще "что-нибудь" - имеет тип const char[количество символов+1], на то он и конст, чтоб не изменяли его. Но вот каким-то компиляторам пофиг.
1
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
08.07.2010, 17:29 | 10 |
Потому, что "qwerty" - это строковый литерал, константа, и его компилятор волен расположить в read-only memory. Разумеется, попытка записи в RO память завершится с Access Violation. Странно, если бы было иначе.....
Кстати, правильно писать const char *p = "qwerty"; Но компиляторы, к сожалению, в целях совместимости со старым кодом, допускают и первоначальное объявление....
2
|
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
|
08.07.2010, 17:40 | 11 |
_ya, RAD Studio 2010 тоже выполнила без ошибок.
Чем вы пользуетесь? И каков тип сборки?
0
|
09.07.2010, 10:17 | 12 |
Почитай тут
Изменить значение указателя Почему работает вариант alex_x_x почитай тут Чем по умолчанию инициализируется символьный массив?
1
|
0 / 0 / 0
Регистрация: 14.08.2008
Сообщений: 19
|
|
09.07.2010, 21:00 [ТС] | 13 |
CheshireCat, то что "qwerty" - это строковый литерал, константа знаю, посему и написал:
Но компилятор, когда формирует объектные файлы видит же, что я избавляюсь от константности: 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 минут Пользуюсь VS2005 Professional. Пару лет назад начал с нее, так и юзаю, все вроде нравится и с QT она хорошо работает в отличие от 2008, с которой как-то QT не подружилась у меня...
0
|
Унылый школьник
126 / 60 / 10
Регистрация: 06.11.2009
Сообщений: 353
|
|
09.07.2010, 21:16 | 14 |
_ya, это особая константа, все строковые литералы хранятся отдельно, их изменять нельзя. Можно сравнить это с попыткой изменить числовой литерал. Вы же используете указатель. Рекомендую внимательно почитать вот этот пост. Ну и вообще посмотреть этот топик.
1
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
10.07.2010, 00:29 | 16 |
Согласно стандарту, при попытке снять константность оператором const_cast и изменить объект, изначально созданный как const, поведение программы не определено. Эти действия возможны только для объекта, на который константность была навешена уже после создания.
1
|
0 / 0 / 0
Регистрация: 14.08.2008
Сообщений: 19
|
|
12.07.2010, 16:13 [ТС] | 17 |
Пасиба, парни, разобрался.
0
|
12.07.2010, 16:13 | |
12.07.2010, 16:13 | |
Помогаю со студенческими работами здесь
17
почему вылетает из программы? Почему то вылетает отладчик Вылетает эксепшн при загрузке плагина Эксепшн Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |