Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2009, 02:18   #1
Эйнж
 
Аватар для Эйнж
 
Регистрация: 02.08.2008
Сообщений: 9
По умолчанию char* и вопрос о смещениях

char* str = "some text";
*(str+1) = 'T';

Объясните пожалуйста, почему компилятор компилирует код без вопросов, а при выполнении выходит сообщение об ошибке:

Unhandled exception at 0x000c13d8 in ConsoleTest.exe: 0xC0000005: Access violation writing location 0x000c580a.
Эйнж вне форума Ответить с цитированием
Старый 25.11.2009, 08:04   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Проверил на Борланд С++
Код:
{
char* str = "some text";
*(str+1) = 'T';
 cout<<str;
 system("pause");
	return 0;
}
Работает идеально. Видать компилятор твой скабрезный дюже.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.11.2009, 10:54   #3
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
char* str = "some text";
это строковый литерал, его нельзя изменять

а вот так будет работать

Код:
char str[] = "some text";
*(str+1) = 'T';
counter вне форума Ответить с цитированием
Старый 25.11.2009, 11:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
это строковый литерал, его нельзя изменять
А пояснение можно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.11.2009, 11:54   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Stilet
Код:
char str* = "some text";
правая часть - строковый литерал. а строковый литерал это const char*.
Соответственно, имеем указатель на константую строку. Вообще правильней писать так:
Код:
const char *str = "some text";
в этом же варианте
Код:
char str[] = "some text";
строка скопируется в массив str, и его уже можно изменять.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 25.11.2009, 14:24   #6
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Мне кажется, всё проще - в первой строке программа пытается записать в нераспределённую память.

P. S. проверил в компляторе - я ошибся. Похоже, pproger был прав.

Последний раз редактировалось ds.Dante; 25.11.2009 в 14:27.
ds.Dante вне форума Ответить с цитированием
Старый 25.11.2009, 14:57   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
правая часть - строковый литерал. а строковый литерал это const char*.
Видимо Борландовцы с тобой не согласны раз позволяют изменять содержимое строки char str* и я их поддерживаю - это никак не константа.
А вот если я действительно пропишу const char* тогда да.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.11.2009, 15:33   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Stilet
Код:
printf("%s\n", "text");
"text" является константой?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 25.11.2009, 17:59   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

В принципе действительно это зависит от компилятора и настроек линкера. Видимо борланд распределяет константы в секции с меткой readable и writeable, в то время, как студия помечает только readable. Вообще много видел споров на тему, где же именно должны размещаться константы, но исходя из семантики, константы действительно должны быть недоступны для записи

Последний раз редактировалось netrino; 25.11.2009 в 18:23.
netrino вне форума Ответить с цитированием
Старый 25.11.2009, 19:22   #10
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Stilet
Цитата:
А вот если я действительно пропишу const char* тогда да.
строковый литерал - последовательность символов, заключенная в двойные кавычки. (литерал = константа)
возможность присваивания строкового литерала к char* осталась лишь для совместимости со старым сишным кодом. Но да, как уже написали и как говорил Страуструп, разные реализации по разному относятся к нарушению этого правила.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка cannot convert from 'char *' to 'char [100]' Stellvertreter Общие вопросы C/C++ 5 30.05.2010 00:02
Вопрос по char* and277 Общие вопросы C/C++ 7 11.10.2009 20:39
FastString::FastString(const char *psz) : m_psz(new char [strlen(psz) + 1]) { strcpy(m_psz, psz); } lebedun Общие вопросы C/C++ 3 27.03.2009 03:43
отличие char* str ="..." от char ...[]="..." StarWorm Общие вопросы C/C++ 2 20.11.2008 08:48
Есть таблица - В ней три поля int, char, char нужно чтобы данные заносились в таблицу Mysql Muahahaha PHP 8 27.03.2008 11:17