Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение памяти, не вкурю 
:(
    Опции темы
MAKCim
Дата 10.2.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



сейчас открыл Страуструпа и убедился
тип "example" ~ const char[8]
т. е Borland не прав - он обязан располагать "example" в read-only секции (конечно, если формат exutable файла их предусматривает... если нет - в топку такой формат)
Цитата

Строковым литералом называется последовательность символов, заключенных в двойные кавычки. В строковом литерале на один символ больше, чем используется при записи; он всегда заканчивается нулевым символом '\0', значение которого равно 0. Тип строкового литерала есть "массив с надлежащим количеством константных символов". Строковый литерал можно присвоить переменной типа char*. Однако изменение строкового литерала через такой указатель является ошибкой

Надеюсь, вопрос исчерпан?

Это сообщение отредактировал(а) MAKCim - 10.2.2007, 13:41


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Anikmar
Дата 10.2.2007, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @  10.2.2007,  13:31 Найти цитируемый пост)
сейчас открыл Страуструпа и убедился
тип "example" ~ const char[8]
 


А я с этим и не спорил - именно поэтому так нельзя: "example"[0] = 1;

Пример:
    const int pInt[3] = {1,2,3};
    int *t;
//    pInt[2] = 5; - Нельзя менять константный объект

    t = (int*)pInt;
    t[1] = 2; // Теперь можно - и ничего мы не нарушили (кроме здравого смысла) И ничего не вылетело



PM MAIL ICQ   Вверх
MAKCim
Дата 10.2.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Anikmar @  10.2.2007,  13:38 Найти цитируемый пост)
/ Теперь можно - и ничего мы не нарушили (кроме здравого смысла) И ничего не вылетело

у меня вылетело, это раз
во-вторых тут опять запись в read-only секцию
Anikmar, 
каким компилятором пользуешься?

Добавлено @ 13:47 
Цитата(Anikmar @  10.2.2007,  13:38 Найти цитируемый пост)
А я с этим и не спорил - именно поэтому так нельзя: "example"[0] = 1;

да ладно  smile 
Код

(char*)("example")[0] = 1;



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Anikmar
Дата 10.2.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @  10.2.2007,  13:45 Найти цитируемый пост)
Anikmar, 
каким компилятором пользуешься?

BCB 6.0
PM MAIL ICQ   Вверх
MAKCim
Дата 10.2.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Anikmar @  10.2.2007,  13:49 Найти цитируемый пост)
BCB 6.0 

я бы его выбросил  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Anikmar
Дата 10.2.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @  10.2.2007,  13:45 Найти цитируемый пост)
у меня вылетело, это раз


И так вылетит?
Код

     const int pInt[3] = {1,2,3};
    int *t;
//    pInt[2] = 5; - Нельзя менять константный объект
//    t = (int*)pInt;
   t = const_cast<int*>(pInt);
    t[1] = 2; // Теперь можно - и ничего мы не нарушили (кроме здравого смысла) И ничего не вылетело

PM MAIL ICQ   Вверх
MAKCim
Дата 10.2.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Anikmar, 
да
на самом деле в этом случае GCC располагает массив в read-only секции, но уменьшает ESP, не нарушая тем самым семантику использования таких массивов
в 
Код

t = const_cast<int*>(pInt);

или
Код

t = (int*)pInt;

мы получаем адрес массива в read-only секции и  в итоге вылет
т. е компилятор умен и дает нам пинок под зад  smile (правда с задержкой до run-time) за нашу неграмотность
вот это я понимаю - качество

Это сообщение отредактировал(а) MAKCim - 10.2.2007, 13:59


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
vinter
Дата 10.2.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата
да


а у меня(VS 2003) нет, да и с чего это оно должно вылететь, когда const снят?? 


--------------------
Мой блог
PM MAIL WWW   Вверх
Anikmar
Дата 10.2.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @  10.2.2007,  13:54 Найти цитируемый пост)
вот это я понимаю - качество

Качество? А для чего тогда конструкция const_cast в языке предусмотрена? Я неправильно ее использовал?
PM MAIL ICQ   Вверх
vinter
Дата 10.2.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата
т. е компилятор умен и дает нам пинок под зад   (правда с задержкой до run-time) за нашу неграмотность
вот это я понимаю - качество


какое качество?? я сознательно снимаю константность!!! это противоречит свободе!smile


--------------------
Мой блог
PM MAIL WWW   Вверх
MAKCim
Дата 10.2.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(vinter @  10.2.2007,  14:00 Найти цитируемый пост)
а у меня(VS 2003) нет, да и с чего это оно должно вылететь, когда const снят??  

const_cast<> можно использовать для псевдоконстантных переменных
т. е
Код

void F(const int* c) {
    int *d = const_cast<int*>(c); // катит, когда c = a
}
...
int a[3] = {1, 2, 3};
const int b[3] = {1, 2, 3};
F(a);
F(b);



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
vinter
Дата 10.2.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



MAKCim, первый раз такое слышу, в Страуструпе не нашел(толстая книга оченьsmile), но у Шилдта не слова про ограничения использованиия const_cast(кроме здравого смысла), к тому же студия меня еще ни разу не подводила, и если она позволяет делать такое, то я ей вполне доверяю..


--------------------
Мой блог
PM MAIL WWW   Вверх
Anikmar
Дата 10.2.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @  10.2.2007,  14:03 Найти цитируемый пост)
const_cast<> можно использовать для псевдоконстантных переменных

Зашел на сайт страуструпа. Тоже такого не нашел

Добавлено @ 14:18 
Цитата(MAKCim @  10.2.2007,  13:54 Найти цитируемый пост)
мы получаем адрес массива в read-only секции и  в итоге вылет
т. е компилятор умен и дает нам пинок под зад   (правда с задержкой до run-time) за нашу неграмотность
вот это я понимаю - качество

Это говорит о низком качестве поддержки стандарта. Разработчики не парились - и просто запретили.
PM MAIL ICQ   Вверх
Xenon
Дата 10.2.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Да, на VC++ 2005 такое катит
Код

const int pInt[3] = {1,2,3};
*(int*)(&pInt[0])=5;



--------------------
user posted image  
PM MAIL   Вверх
MAKCim
Дата 10.2.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Anikmar @  10.2.2007,  14:17 Найти цитируемый пост)
Это говорит о низком качестве поддержки стандарта. Разработчики не парились - и просто запретили. 

скорее наоборот ибо
const_cast<> лишь анулирует const в семантическом контексте, т. е на уровне конструкций исходного кода,
истинный const-объект должен помещаться в read-only память
const_cast<> разрешит компилятору использовать const-объект как не-const, но только на уровне исходного кода


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.