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

Поиск:

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



здрасти...объясните плиз

создаем что-то типа буфера

char buf[100];-100 чаров
потом из этой памяти берем определенное число
char * p=new (buf)char[120]-чаров

почему компилятор не выдает ошибки...разве тут не будет переполнения..
даже если for'ом заполнить область на которую ссылается p...ошибки тоже не возникает...
в чем прикол...мож я что недопонял :qstn
--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
SerpentVV
Дата 7.2.2007, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



С++ не проверяет границы массивов при работе с указателями...
Компилятор не в состоянии отследить значение компилятора во время выполнения, поэтому считает, что программер знает, что делает...

PM MAIL   Вверх
ip127001
Дата 7.2.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



Цитата(SerpentVV @  7.2.2007,  17:21 Найти цитируемый пост)
С++ не проверяет границы массивов при работе с указателями...
Компилятор не в состоянии отследить значение компилятора во время выполнения, поэтому считает, что программер знает, что делает...

от оно как..лан спасибо вопрос исчерпан... smile

Добавлено @ 17:28 
ух ты какой кавардак будет если напортачить... smile 
--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
Sartorius
Дата 7.2.2007, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

ух ты какой кавардак будет если напортачить...   

 Не хочешь сам контролировать доступ к памяти - используй managed технологии. Такие как Java и .NET
PM MAIL ICQ   Вверх
ip127001
Дата 7.2.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



Цитата(Sartorius @  7.2.2007,  17:31 Найти цитируемый пост)
Не хочешь сам контролировать доступ к памяти - используй managed технологии. Такие как Java и .NET

нет уж...я привык думать сам!
--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
SerpentVV
Дата 7.2.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Вместо массивов используй стандартный контейнер vector из STL. Тогда не придется следить за индексами...
Там еще и list eсть и stack и queue... smile 
PM MAIL   Вверх
Любитель
Дата 7.2.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Есть кстати куча всяких коде-анализеров, которые подобные ошибки находят. Для большого сишного кода - достаточно приятно (для плюсов - спасают готовые контейнеры, смарт-поинтеры и пр.).


--------------------
PM MAIL ICQ Skype   Вверх
Daevaorn
Дата 7.2.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



странный вопрос
Цитата(ip127001 @  7.2.2007,  18:18 Найти цитируемый пост)
char buf[100];-100 чаров

на стеке. buf указывает на начало
Цитата(ip127001 @  7.2.2007,  18:18 Найти цитируемый пост)
char * p=new (buf)char[120]-чаров

менеджер памяти ссылается на UB и делает всё что вздумается, скорей всего убивает стек.
PM MAIL WWW   Вверх
Любитель
Дата 7.2.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Если повезёт - может пролететь  smile Управление паметью непостижимо...


--------------------
PM MAIL ICQ Skype   Вверх
Rockie
Дата 7.2.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 8
Всего: 31



Цитата(ip127001 @  7.2.2007,  17:18 Найти цитируемый пост)
почему компилятор не выдает ошибки...

у меня в VS2005 выдает, C2660

Цитата(ip127001 @  7.2.2007,  17:18 Найти цитируемый пост)
даже если for'ом заполнить область на которую ссылается p...ошибки тоже не возникает...

даже если напишешь
Код

#include "stdafx.h"

int main()
{
    char buf[100];
    buf[1000] = 'a';
    return 0;
}

то это как "повезет-не повезет"




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Любитель
Дата 7.2.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Код

// main.c

#include <stdio.h>

int main()
{
   char* s = "!!!";
   s[1] = "?";
   printf(s);
   return 0;
}

В VS2005 деьаг версия успешно компилится и успешно вылетает. Самое интересное, что релиз тупо выводит три восклицтаельных знака  smile 


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


Эксперт
****


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

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



Цитата(Любитель @  7.2.2007,  19:30 Найти цитируемый пост)
   s[1] = "?";

И как такое смогло скомпилиться? Я что-то не понял...


 smile 
Блин! Я что, перестал русский язык знать?! Что не пост - то ошибка в родном языке! Иногда править ленюсь, а потом стыдно! Наверное это программерская болезнь...

Это сообщение отредактировал(а) Anikmar - 7.2.2007, 20:50
PM MAIL ICQ   Вверх
threef
Дата 7.2.2007, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

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



Цитата

char * p=new (buf)char[120]


Откуда взялся такой синтаксис ?
PM MAIL   Вверх
Anikmar
Дата 7.2.2007, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



threef, я привел цитату Любителя - выше моего поста.... Он написал, что компилится нормально, а я удивился - как такое может скомпилиться?
PM MAIL ICQ   Вверх
threef
Дата 7.2.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

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



а я из loopback-а, с первого поста. 
Компилится, работает smile
остается предложить сделать delete [] p
Пойду за мылом и веревкой.
PM MAIL   Вверх
Anikmar
Дата 8.2.2007, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(threef @  7.2.2007,  21:37 Найти цитируемый пост)
а я из loopback-а, с первого поста. 


Тьфу, это я уже запутался...
char * p=new (buf)char[120]
Эта конструкция ничего не нарушает.
Мы приводим указатель на char к указателю на char - так как buf в чистом виде является именно этим.

В языке Си имя массива без скобок является указателем на начало массива.

так что 
char *b
char bb[10]

b и bb эквивалентны.

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



Цитата(SerpentVV @  7.2.2007,  17:51 Найти цитируемый пост)
Вместо массивов используй стандартный контейнер vector из STL. Тогда не придется следить за индексами...
Там еще и list eсть и stack и queue...  

это все ясно....но не потеме..

Цитата(threef @  7.2.2007,  21:37 Найти цитируемый пост)
а я из loopback-а, с первого поста. 
Компилится, работает 
остается предложить сделать delete [] p
Пойду за мылом и веревкой.


не говори сам в шоке..

там кто-то говорил что на VC ошибка при компиляции возникает см. пост 1
так на BC++ 6 голяк...даже не заикнулся smile ..

хорошо я так для прикола решил проверить...теперь буду внимательно_ОЧЕНЬ_этим пользоваться...
а то в проге лям такой допустишь, и до нового года искать ошибку будешь... smile 



--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
MAKCim
Дата 8.2.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Anikmar @  8.2.2007,  00:40 Найти цитируемый пост)
Эта конструкция ничего не нарушает.
Мы приводим указатель на char к указателю на char - так как buf в чистом виде является именно этим.

ничего мы не приводим
эта конструкция placement new называется
Цитата(Anikmar @  8.2.2007,  00:40 Найти цитируемый пост)
так что 
char *b
char bb[10]
b и bb эквивалентны.

с чего это вдруг? это разные типы и никакой эквиваленции быть не может
другое дело, что компилятор неявно прииводит char[] к char* в некоторых случаях



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

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


Эксперт
****


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

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



Цитата(MAKCim @  8.2.2007,  09:56 Найти цитируемый пост)
с чего это вдруг? это разные типы и никакой эквиваленции быть не может

Может я неправильно выразился.
Имя массива является указателем.
Некоторое исключение составляет явное определение размера массива.
Запись такого вида:
Код

char *pMas;
.....

pMas[5] = '0';


Нормально откомпилируется и будет работать без всяких вопросов.
PM MAIL ICQ   Вверх
zkv
Дата 8.2.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 26
Всего: 92



Цитата(Anikmar @  8.2.2007,  10:08 Найти цитируемый пост)
Имя массива является указателем.

а не константным указателем случайно? (это про отличие b и bb)
PM MAIL   Вверх
SerpentVV
Дата 8.2.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Цитата(Anikmar @ 8.2.2007,  10:08)
Цитата(MAKCim @  8.2.2007,  09:56 Найти цитируемый пост)
с чего это вдруг? это разные типы и никакой эквиваленции быть не может

Может я неправильно выразился.
Имя массива является указателем.
Некоторое исключение составляет явное определение размера массива.
Запись такого вида:
Код

char *pMas;
.....

pMas[5] = '0';


Нормально откомпилируется и будет работать без всяких вопросов.

1. Имя массива является конст антным указателем - этог только в С было...
В С++ имя массива приводится к указателю в некоторых случаях...
2. Не советую использовать такие конструкции... Там не хватает как минимум new
Код

char *pMas;
pMas = new char[N];          // N должно быть > 5

pMas[5] = '0';

Иначе можно нарваться... smile

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


Эксперт
****


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

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



Цитата(SerpentVV @  8.2.2007,  12:38 Найти цитируемый пост)
2. Не советую использовать такие конструкции... Там не хватает как минимум new

Я специально поставил многоточие. Выделение памяти может осущестляться различными методами, совершенно необязательно оператором new (оставим правильность такого подхода с точки зрения общепринятых и рекомендуемых методов).

Я именно про конструкцию:
Код

char *pMas;
char pMas1[50];

pMas = pMas1;  - Допустимо
pMas[0] = '1'; - Допустимо
pMas1 = pMas; - Недопустимо - так как константный указатель
*(pMas1+2) = '1'; - Допустимо
*pMas = '1'; - Тоже допустимо
pMas = malloc(100); - Допустимо
pMas = MyMemoryManager(100); - Допустимо, память выделяется собственным менеджером памяти


Про константный я и не спорил, я говорил про использование имени массива. Использовать имя массива как указатель допустимо и никаких ошибок не вызовет.
PM MAIL ICQ   Вверх
Любитель
Дата 8.2.2007, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Anikmar, сорри в апострофах, конечно - писал быстро, ошибся чуток.


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


Эксперт
****


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

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



Цитата(Любитель @  7.2.2007,  19:30 Найти цитируемый пост)
В VS2005 деьаг версия успешно компилится и успешно вылетает. Самое интересное, что релиз тупо выводит три восклицтаельных знака    


Короче, в билдере все работает как надо - выводит !?! как и положено.
Я пас - студию, к сожалению, не знаю.


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


Explorer
****


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

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



Любитель, в 2003 вылетает и в release и в Debug
Цитата
Короче, в билдере все работает как надо - выводит !?! как и положено.


никаких тут как надо!!  это константа, ее нельзя менять, так что билдер плохо сработал..


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


Эксперт
****


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

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



vinter, почему константа? если написать const char *p = "ку-ку"; тогда константа...

Ща для интереса гляну в стандарт.

Добавлено @ 00:36 
Может плохо смотрел, но в черновике стандарта ни слова не нашел про константу....  smile 
PM MAIL ICQ   Вверх
vinter
Дата 9.2.2007, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



стандарт в глаза не виделsmile
но верю Струструпу char *p = "111"; , и const char *p = "111"; одно и тоже  


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


Гентозавр
****


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

Репутация: 19
Всего: 181



Цитата(Anikmar @ 8.2.2007,  23:26)
почему константа?

Сам техт "!!!" - это константа (присваивается же только указатель), она хранится где-то в памяти, и при попытке изменить её скорее всего программа вылетит.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Anikmar
Дата 9.2.2007, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nickless @  9.2.2007,  00:58 Найти цитируемый пост)
Сам техт "!!!" - это константа (присваивается же только указатель), она хранится где-то в памяти, и при попытке изменить её скорее всего программа вылетит. 


Да почему? Объясните, мне, дураку?

Во многих старых учебниках по Си давалось предупреждение:
"С осторожностью изменяйте текстовые строки - при установке опции компилятора "соединять одинаковые строки" вы можете получить нежелательные результаты"

То, что так делать не надо - я даже спорить не буду, но то, что стандарт это не запрещает - это факт.

Код

char *p1 = "ку-ку";
char p2[] = "ку-ку";
p1[1] = 'A'; // Так можно - стандарт не запрещает
p2[1] = 'B'; // Так тоже можно - стандарт  не запрещает
p1++; // так можно, стандарт не запрещает
p2++; // А вот так низя!


Это сообщение отредактировал(а) Anikmar - 9.2.2007, 01:19
PM MAIL ICQ   Вверх
nickless
Дата 9.2.2007, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

Репутация: 19
Всего: 181



Теоретически константы можно изменять, это всего лишь фича языка, да и в стандарте имхо точно не описано что будет если изменить константу через каст или указатель.
Но, каждый компилятор реализует и оптимирует их по-разному (может например расположить их где-нибудь в памяти, куда нет доступа на запись), так что результат зависит от фазы луны, положения звёзд и некоторых других общеизвестных факторов.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Anikmar
Дата 9.2.2007, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nickless @  9.2.2007,  01:33 Найти цитируемый пост)
Но, каждый компилятор реализует и оптимирует их по-разному

Лично я на практике не встречал компилятора, который бы запретил такие действия или сделал их неправильно. Возможно теперь буду знать один - студию.

Я начинал с турбо си, и в одном из учебников даже разбирался код, меняющий строку (не помню для чего, помню, что экономил память). 

ИМХО Такие действия допустимы в плане ненарушения стандарта, но бессмыслены во всех остальных планах.

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


Гентозавр
****


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

Репутация: 19
Всего: 181



gcc 4.1.1 тоже вылетает

ЗЫ. но не всегда, только без оптимизации, с оптимизацией выводит оба раза "!!!"

Это сообщение отредактировал(а) nickless - 9.2.2007, 01:58


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Anikmar
Дата 9.2.2007, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nickless @  9.2.2007,  01:50 Найти цитируемый пост)
gcc 4.1.1 тоже вылетает

ЗЫ. но не всегда, только без оптимизации, с оптимизацией выводит оба раза "!!!"

Чтож - значит уже два компилятора буду знать  smile 

Тем не менее - теоретически код правильный.

НО! ТАК ДЕЛАТЬ НЕ НАДО! (имхо)
PM MAIL ICQ   Вверх
ip127001
Дата 9.2.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



Цитата(vinter @  9.2.2007,  00:58 Найти цитируемый пост)
стандарт в глаза не видел
но верю Струструпу char *p = "111"; , и const char *p = "111"; одно и тоже  

а с какой стати
int *p=0;
const int *p=0;
одинаковыми стали...первый раз такое слышу!!!?

Добавлено @ 11:26 
они интерпритируются по разному...

Добавлено @ 11:32 
Код


     char *p="!!!";
     const char *p1="!!!";
       *(p+1)='?';-все ок!
      // *(p1+1)='?';-выводит ошибку т.к константа...
       cout<<p;-воводит !?!


     char *p="!!!";
     const char *p1="!!!";
-----------------------это разные вещи
--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
vinter
Дата 9.2.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата
int *p=0;
const int *p=0;
одинаковыми стали...первый раз такое слышу!!!?


не перевирай мои слова, я это сказал только про char
Цитата
 char *p="!!!";
     const char *p1="!!!";
-----------------------это разные вещи


почитай топик нормально, мы уже выяснили, что кроме чисто сишного турбо С, и борланда компиляторы не дают так делать, т.к считают это КОНСТАНТОЙ и из этого следует, что это идентичные вещи и никаких разных интерпретаций!


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


Эксперт
****


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

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



Цитата(vinter @  9.2.2007,  13:08 Найти цитируемый пост)
почитай топик нормально, мы уже выяснили, что кроме чисто сишного турбо С, и борланда компиляторы не дают так делать, т.к считают это КОНСТАНТОЙ и из этого следует, что это идентичные вещи и никаких разных интерпретаций! 


Указатель никто и не пытался менять. Выясняли про собственно строку - в какую память он помещается.

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

Компиляторы дают компилировать код, но вылетает сама программа при работе. Борланд ведет себя как положено в такой ситуации - строка меняется спокойно. Константный указатель или нет - это по барабану, никто не мешает сделать указатель неконстантным, присвоить ему значение проинициализированного строкой и попытаться поменять строку.

В общем то спор о том, что можно или нет менять сами строки, зашитые в коде программы. В двух случаях происходит вылет или некорректная работа (на мой взгляд самая опасная ситуация - не можешь сделать, тогда уж вылетай с исключением, а не парь мозги программисту. А то получится на борланде работает, а в студии работает неправильно. Это некрасиво).

А по поводу к чему преобразовывается - посмотрел используя type_id. Указатель вида char*p = "jsjsjsj"; и просто char *p имеют одинаковый тип (по крайней мере в борланде).
PM MAIL ICQ   Вверх
ip127001
Дата 10.2.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



Цитата(Anikmar @  9.2.2007,  13:24 Найти цитируемый пост)
Указатель никто и не пытался менять. Выясняли про собственно строку - в какую память он помещается


а причем тут область памяти....ты не путаешь указатель на константу с константным указателем?
--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
MAKCim
Дата 10.2.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



есть разница между целочисленной константой и литеральной
если есть целочисленная константа
Код

const int a = 5;

то компилятору не составит труда в качестве одного из операндов команды записать непосредственно 5, потому что это значение константы известно
код 
Код

const int a = 5;
int *b = const_cast<int*>(&a);
*b = 8;
int c = a;

может выглядеть так
Код

push ebp
mov ebp, esp
sub esp, 12
mov [ebp - 4], 5
lea eax, [ebp - 4]
mov [ebp - 8], eax
mov eax, [ebp - 8]
mov [eax], 8
mov [ebp - 12], 5

со строковыми литералами сложнее: непосредственно ее в команду никак не подставишь в отличие от целочисленной константы, поэтому она помещается в read-only секцию данных а в качестве операнда используется ее адрес в этой секции
для GCC это будет так для кода
Код

char *a = "UNIX is the great OS";
int b = 6;
a[b] = 'a';

Код

.section .rodata
string:
    .asciz "UNIX is the great OS"
...
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl -4(%ebp), $string
movl -8(%ebp), $6
movl -8(%ebp), %eax
movl -4(%ebp), %ebx
movl $61, (%ebx, %eax, )
push ebp
mov 

при этом при загрузке исполняемого файла и просмотре заголовков секций находится read-only секция и ее содержимое помещается в какую-то физическую страницу памяти, а в соответствующем этой странице элементе таблицы страниц сбрасывается флаг W, и дальнейшее обращение к ней с целью записи приводит к #PF 
А то, что какой-то Borland допускает изменение константной строки, то это говорит о "качестве" компилятора

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


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

PM MAIL   Вверх
Любитель
Дата 10.2.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



На мой взгяд следовало бы вообще запретить
Код

char* s= "123";

только
Код

const char* s = "123"

 smile 


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


Эксперт
****


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

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



Стало быть так: если мы объявляем массив с инициализацией - его менять можно?
А если строку (которая тоже является массивом) то нельзя?
Если я пишу так
Код

char a[6] = {'H','e','l','l','o',0}; // Меняю как хочу - будет помещено в память со свободным доступом
char *b = "Hello"; // Менять нельзя - память только для чтения

a[1] = 'R'; // Так можно, ни у кого не возникнет вопросов
b[1] = 'R'; // Так нельзя - память только для чтения


Объясните где тут логика и чем строка отличается от массива?! Если я хочу инициализировать массив символов строкой - то в чем собственно проблема? Почему я потом не могу ее поменять?

Цитата(MAKCim @  10.2.2007,  11:00 Найти цитируемый пост)
А то, что какой-то Borland допускает изменение константной строки, то это говорит о "качестве" компилятора

Остаюсь при своем мнении - Борланд позволяет делать то, что не запрещено стандартом и он тут абсалютно прав.

Добавлено @ 12:32 
Цитата(Любитель @  10.2.2007,  11:58 Найти цитируемый пост)
только

const char* s = "123"



Делаю так - и все в порядке?
Код

const char* s = "123"
char *p = s;
p++;


Мы говорим не о возможности изменить УКАЗАТЕЛЬ, а о возможности изменить область памяти, на которую он ссылается!

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


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


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

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



Цитата(Anikmar @  10.2.2007,  12:31 Найти цитируемый пост)
Объясните где тут логика и чем строка отличается от массива?! Если я хочу инициализировать массив символов строкой - то в чем собственно проблема? Почему я потом не могу ее поменять?

строка - константна по своей природе и располагается в read-only области памяти (при выполнении программы)
в этом случае мы просто получаем ее адрес и изменить не можем
Код

char *a = "example";

Код

.section .rodata
string:
    .asciz "example"
...
pushl %ebp
movl %esp, %ebp
subl $4, %esp /* отводим 4 байта под указатель */
movl $string, -4(%ebp) /* собственно копируем указатель на строку */

а в этом создаем копию строки в стеке (read-write область памяти)
Код

char a[] = "example";

т. е грубо говоря компилятор генерирует приблизительно такой код
Код

.section .rodata /* read-only секция данных */
string:
    .asciz "example"
.text /* секция кода */
    pushl %ebp
    movl %esp, %ebp
    subl $8, %esp /* строка занимает 8 байт с нулем в конце */
    movl string, %eax /* копируем первые 4 символа */
    movl %eax, -8(%ebp)
    movl string + 4, %eax /* копируем оставшиеся символы */
    movl %eax, -4(%ebp)

и дальше можем изменять любой элемент a
конструкция же
Код

char a[8] = {'e', 'x', 'a', 'm', 'p', 'l', 'e', 0};

вообще банально проста (даже нет никакой символьной строки - просто символы)
Код

.text /* секция кода */
    pushl %ebp
    movl %esp, %ebp
    subl $8, %esp /* строка занимает 8 байт с нулем в конце */
    movl $0x6d617865, -8(%ebp) /* число 0x6d617865 в памяти располагается как 65 78 61 6D, что соответствует 'e' 'x' 'a' 'm' */
    movl $0x00656c70, -4(%ebp) /* 0x00656c70 -> 'p' 'l' 'e' '\0' */


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


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

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


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


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

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



Цитата(Anikmar @  10.2.2007,  12:31 Найти цитируемый пост)
Остаюсь при своем мнении - Борланд позволяет делать то, что не запрещено стандартом и он тут абсалютно прав.

он не размещает константу (в данном случае символьную) в read-only секции данных - вот здесь его "хорошие" качества проявляются


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

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


Эксперт
****


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

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



Цитата(MAKCim @  10.2.2007,  12:55 Найти цитируемый пост)
строка - константна по своей природе

Это из чего следует?

Я программист. Мне нужен строка флагов. Я могу ее создать двумя способами:

char Options[] = "AAABBBCCDDEEFF";

или

char *Options = "AAABBBCCDDEEFF";

Язык мне это разрешает, никакого запрета нет.

Если абстрагироваться от мысли, что строка, это обязательно текстовая константа, выводимая на экран и рассматривать ее как инициализированный массив char - то все в порядке.

Я не говорю, что так нужно делать. Я говорю о том, что теоретически можно. Но не нужно.

И в некоторых учебниках по си (конечно, старых) укаазывалось, что данный код необходимо применять с осторожностью, особенно, если указана опция соединять одинаковые строки.
Цитата(MAKCim @  10.2.2007,  12:55 Найти цитируемый пост)
а в этом создаем копию строки в стеке (read-write область памяти)

Вот тут для меня загадка. И это, называется оптимизацией? Зачем две одинаковые строки в памяти?

Резюме: мы такой баян растянули - что скоро остальные смеяться будут. Все равно каждый останется при своем мнении.
Я остаюсь при таком: Делать так не стоит - так как непринято, противоречит хорошему тону программирования и т.п. Но к ошибке приводить это также не должно.

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


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


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

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



Цитата(Anikmar @  10.2.2007,  13:15 Найти цитируемый пост)
Это из чего следует?

из того, что ты не можешь написать
Код

"bla-bla-bla"[0] = 'd';

равно как
Код

5 = a;
9.89 = b;

Цитата(Anikmar @  10.2.2007,  13:15 Найти цитируемый пост)
Вот тут для меня загадка. И это, называется оптимизацией? Зачем две одинаковые строки в памяти?

это пример, естественно оптимизация возможна, но факт остается фактом: в одном случае мы используем указатель на строку в read-only секции, в другом - мы ее создаем (а уж с оптимизацией или нет - зависит от компилятора)
Цитата(Anikmar @  10.2.2007,  13:15 Найти цитируемый пост)
Но к ошибке приводить это также не должно.

должно
Цитата(Anikmar @  10.2.2007,  13:15 Найти цитируемый пост)
Все равно каждый останется при своем мнении.

это не тот случай, где возможны мнения


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

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


Эксперт
****


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

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



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

Да ладно уж. Мнения возможны всегда, даже если они неправильбные - это просто ошибочные мнения.

"bla-bla-bla"[0] - Такая конструкция запрещена синтаксисом самого языка.

Что не запрещено стандартом должно быть разрешено. Никто не давал права трактовать стандарт по своему усмотрению. Я ничего не нашел в стандарте по поводу запрета изменения строки. Конечно, этот способ скорее пережиток Си и MSDOS, но ничего криминального я не вижу. Моя память - что хочу то и делаю!


PM MAIL ICQ   Вверх
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   Вверх
Любитель
Дата 10.2.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Добавлю - последствия использование константного объекта, пропущенного через конст-каст, как неконстантного непредсказуемы. Нужен конст-каст для совместимости. Например, есть функция
Код

int f (char* s);

возвращающая некоторрое значение, но неизменяющая строку (по хорошему, конечно, конст должен стоять - но такое возможно). Вот здесь юзаем конст-каст.

Это сообщение отредактировал(а) Любитель - 10.2.2007, 16:43


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


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


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

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



Любитель, 
да, так оно и есть


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

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


Эксперт
****


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

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



Цитата(MAKCim @  10.2.2007,  16:29 Найти цитируемый пост)
const_cast<> лишь анулирует const в семантическом контексте, т. е на уровне конструкций исходного кода,

А я и пишу семантическими конструкциями. И если четко непрописано, что менять нельзя - значит можно.

Если данная конструкция допустима в рамках стандарта - а она допустима, в этом я убедился, значит не компилятора это дело учить программиста жизни. Предупредить - можно, а вылетать нельзя.

В стандарте четко сказано, что такое преобразование возможно, но осуждается. Осуждается, но не запрещается. Хотя бы на приведенном примере. То, что это противоречит здравому смыслу - я не спорю, но это отдельная тема.

Кстати, некторые примеры на Си показывали как делать полиморфный код. И эти коды рабочие (под ДОС). Не знаю как под виндами. Это уже прямая запись в сегмент кода (я не знаю доступен он для записи или нет). Но стандарт Си это разрешает (в Си++ не смотрел).

В общем как я и сказал все равно каждый останется при своем мнении.

Я остаюсь на стороне стандарта.

 smile  Не ссорьтесь, горячие финские парни!  smile 
PM MAIL ICQ   Вверх
nickless
Дата 10.2.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

Репутация: 19
Всего: 181



Стандарт стандартом, а от реализации не убежишь


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
MAKCim
Дата 10.2.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Anikmar, 
бесполезно с вами спорить
следуйте стандарту и будьте счастливы  smile 


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

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


Эксперт
****


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

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



Цитата(MAKCim @  10.2.2007,  17:56 Найти цитируемый пост)
следуйте стандарту и будьте счастливы    

Давно предлагал свернуть этот баян.

 smile 
PM MAIL ICQ   Вверх
Любитель
Дата 10.2.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Итак - все довольны  smile 

Но борланд в очередной раз опозорился


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


Эксперт
***


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

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



Имеется мнение, что const_cast<type> равносильно (type*) и было введено лишь из соображений читабельности кода smile Собственно в С было (type), в С++ static_cast<> и т.д.
Но почему помещается объект не в read-only - непонятно smile

Это сообщение отредактировал(а) Xenon - 10.2.2007, 20:39


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


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


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

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



Цитата(Xenon @  10.2.2007,  20:38 Найти цитируемый пост)
Но почему помещается объект не в read-only - непонятно

да понятно почему  smile 


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

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


Эксперт
***


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

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



MAKCim, а как тогда сделать неизменяймый участок памяти?


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


Эксперт
***


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

Репутация: 8
Всего: 31





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 11.2.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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





--------------------
user posted image  
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.1319 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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