Уважаемый David!
Прежде всего хотелось бы, что-бы Вы читали внимательнее ВСЕ посты входящие в обсуждение, прежде чем отвечали:
>>char p = new char[ 1 ];
>>
>>:) (это по поводу 255)
>
>Уважаемый sas, вы совершенно не понимаете указателей и принципа работы с ними.
>Когда вы пишете char p, p - это статическая переменная, под
>неё уже выделен один байт памяти.
1) p - НЕ СТАТИЧЕСКАЯ а автоматческая == локальная переменная Место под хранение ее значения выделяется в СТЕКЕ. Да это один байт
> new char ([1] там совершенно
>не нужно) выделяет 1 байт в куче и возвращает 4-байтовый адрес
>места этого одного байта в памяти.
Полностью с этим согласен (ниже, чтобы Вам было проще, полная копия одного из
моих предидущих сообщений):
================================================
Сообщение от sas on 08-Июл-03, 10:22 (MSK)
>как можно выделить 255х1 байт под 1 байт?
>char *str1 = new char[255];
Кстати, перечитав свой и Ваш ответы, я заметил, что Вы неправильно выразили свою мысль:
Дело в том, что new возвращает указатель (на i386 это long (если не ошибаюсь)) Так что при записи
char ptr_ = new char[ SZ ];
из-за разницы в размерах происходит потеря (truncate) 3-х старших байт. И совершенно не важно чему равен SZ (хоть 10000)
Конечно в любом случае это ошибка (вероятность того, что значение указателя не было при этом искажено очеееееееень мала), но надо понимать, что происходит "за кадром"
Именно из-за такого типа проблем компилятор всегда будет ругаться
Успехов
--- sas
=====================================================
> Однобайтовой переменной типа char, очевидно,
>нельзя присваивать 4-байтовый указатель.
>Правильная конструкция:
>
>char *p = new char;
>или
>char *p = new char[255];
>
В принципе это правильно (см выше), однако НИКТО не мешает программисту сделать это (потерю данных) сознательно, поэтому компилятор выдает только предупреждение. Согласен, что это ПЛОХО (см выше).
Кроме того, если бы Вы дали себе труд прочитать ВСЕ, Вы бы заметили, что в данный момент обсуждается фраза:
"как можно выделить 255х1 байт под 1 байт?"
эта же фраза в принципе равна такой
"как можно выделить 255х1 байт под 4 байт?"
Все что я хотел показать в такой строчке, с учетом небольшой иронии:
char p = new char[ 1 ] == "как можно выделить 1х1 байт под 1 байт?"
Подчеркивая, что фраза В КОРНЕ не верна (См смайлик в моем ответе после этой строки)
>А вообще - советую внимательно перечитать главу об указателях и ссылках какой-нибудь
>хорошей книжки по сям. Это, кстати, один из самых сложных для
>понимания моментов в этом языке.
>Простите, если чем обидел, я хотел как лучше :)
Краткая история вопроса:
Зачинатель обсуждения задал вопрос, К сожалению он так больше и не показался
В его вопросе была строка типа "char str = new char[ ... ]" Кстати такого рода опечатки достаточно часты (и не надо убеждать меня в том, что вы их никогда не делали) При наличии такой опечатки компилятор выдаст предупреждение, которое нормальный человек игнорировать не будет за исключением РЕДЧАЙШИХ случаев
Я предположил, что задавающий вопрос, "замаскировал" переменную класса локальной переменной в конструкторе, при этом (как и автор вопроса Copy/Paste) сделав ОПЕЧАТКУ. Прблемой это не является, тк как я уже упомянул компилятор меня бы поправил. В случае непроинициализированного члена класса компилятор НИКАКИХ предупреждений/ошибок не выдаст (по крайней мере g++ 3.1).
ЗАКЛЮЧЕНИЕ:
1 Давайте не вешать ярлыков
2 Читать ВСЕ посты внимательнее
Пункт 2 относится и ко мне тоже. Я помню свой ляп по поводу регулярного выражения, где Вы меня поправили
Успехов
--- sas