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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение памяти, не вкурю 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0932 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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