Моя любимая тема про выделение памяти, на этот раз new
Глупые вопросики,так что не закидывайте вилами,мб для кого-то это мега понятна,а кто-то я. Поделю 2 вопроса блоками.
Блок1
Предположим,я выделил память,что я могу сюда записать и как могу разделить,а так же как могу использовать? Вопрос риторический,скорей сам себе для рассуждения
char *ptr =new char(20); //Или же char *ptr = malloc(05)
Я понимаю так: *ptr у меня получает значение 20 указателей на тип char*,в каждом из которых 1 байт т.е. 8 бит нулей/единиц,но из-за особенности типа в каждом свой символ. Я могу записывать в каждый байт что-то,а могу записать значение которое будет занимать не больше выделенного.
Т.е.
- хочу 5 слов по 4 байта(символа)
ptr[0]='aaaa';ptr[4]='aaaa')(и так ещё 3 раза,предположим что 'aaaa'заняли 4 байта(1 буква - 1 байт),для наглядности)итого 20 байт-пожалуйста. - Хочу 20 букв(символов)
ptr[0]='a';ptr[1]='a')(и так ещё 18 раз,предположим что 'a'заняла 1 байт(1буква-1байт),для наглядности)в сумме так же 20 байт-без проблем.
Так же, тут мои мысли,не больше я могу записать ну например,хочу ptr[0]=(int)123и мы занимаем intом 4 байта (1число 4 байта т.к. int) и всего могу только 5 циферок записать на тип int и т.д. Смысл того что пихаю ногой и int значение, 5 intов по 4 байта в сумме 20 байт выделенной памяти.
Блок2
И ещё момент,выделяем точно так же память,но.
char *ptr =new char(23) //Или же char *ptr = malloc(23);
ptr[0]='aaaa';
char **ptrLine= (char**)ptr;
ptrLine[0]=(char*)ptr[0];
И тут у меня небольшая трудность в понимании.
Предположим дальше я занял немного памяти ptr[0]='aaaa' на 4 байта,ради примера(4 буквы 'a'). И я получаю адрес на 0вой занятый 4мя байтами элемент.
И вдруг я захотел сделать что-то такое ptrLine[0]=(char*)ptr[0].
И у меня вытекает 2 вопроса из моих блоков.
- Блок1 Правильно ли я понял и расписал свои мысли?
- Блок2 Что я сделал написав код
ptrLine[0]=(char*)ptr[0]? что мне это дало? (Не обязательно давать мне сложные примеры если вдруг они есть,мне достаточно описать словами,деревенским языком)
P.s. Про delete не забыл,прост это пример, чисто для моего понимания.
Ответы (1 шт):
char *ptr =new char(20);
здесь выделяется память под один байт (под один char). Сюрприз:)
Поэтому, писать куда то далее (например, ptr[1] = 3;) уже плохо - запись за пределы выделенной памяти. Наверно хотелось написать так
char *ptr =new char[20];
,но из-за особенности типа в каждом свой символ
нет, Вы так и не осознали факта, что байт - это байт, а то как Вы его интерпретируете, это другое дело.
ptr[0]=(int)123
так как слева у нас char, то будет произведено приведение типа. И никаких "4 байт" никто не будет занимать. То есть, в первом байте будет записано 123 (да, char обычно знаковый, а 123 < 128).
char *ptr =new char(23) //Или же char *ptr = malloc(23); - уже выяснили, что здесь ошибка
ptr[0]='aaaa'; // а это просто ptr[0] = 1633771873;, по факту запишется 97
char **ptrLine= (char**)ptr; // а зачем приводить тип к тому, чем он не является?
ptrLine[0]=(char*)ptr[0]; // а точно хотите понимать, как именно это может отстрелить ногу ?
тут были рассуждения о этом коде, но я их решил удалить, оставив просто немножко ниже
в последней строке ptr[0] - это char, а Вы его к указателю преобразовываете. В целом, код бессмысленный и даже не стоит его обсуждать. Компилятор выдает такое кол-во предупреждений, что дурно.
Если компилятор на Ваш код выдает предупреждения, не нужно пытаться понять, что делает этот код, скорее всего он просто плохо написан и его надо написать корректно.