= new char[100];
buffer[0] = 't';
buffer[1] = 'e';
buffer[2] = 's';
buffer[3] = 't';
buffer[4] = '\0';
std::cout << sizeof(buffer)/sizeof(char) << std::endl; //??? expecting 100 here but get 8```
логично
strlen() + 1
strlen + 1 (терм.)
Положить рядом с владеющим указателем
А у вас по задаче запрещено пользоваться std::string или просто интересно попробовать C подобную работу со строками?
sizeof тут определяет размер указателя
Я пытаюсь разобраться с указателями и массивами
strlen
а как сделать чтоб он определял размер массива? Потому что оно ведь зарезервировало память для 100 элементов и я пытаюсь понять как получить програмно, что размер массива 100 элементов (а не 5 символов, которые я туда записала).
использовать std::vector
запоминать в переменной размер
если строка - std::string
sizeof(buff) / sizeof(int);
у меня именно так, но оно не работает: ```char* buffer = new char[100]; buffer[0] = 't'; buffer[1] = 'e'; buffer[2] = 's'; buffer[3] = 't'; buffer[4] = '\0'; std::cout << sizeof(buffer)/sizeof(char) << std::endl;```
I. Воздержаться от ненормативной лексики II. Прекратить дробить сообщения на мелкие
В Дин массиве нельзя определить размер
ок а зачем ті написал то же самое что и в вопросе? не дрчитал?
да, оно определяет размер указателя (на моей системе оно 8 байт) и делит на размер чар (1 байт).
#include <array> #include <iostream> int main(){ std::array<char, 100> buffer; buffer[0] = 't'; buffer[1] = 'e'; buffer[2] = 's'; buffer[3] = 't'; buffer[4] = '\0'; std::cout << buffer.size() << std::endl; return 0; }
В общем либо запоминать размер struct {size_t size; char* buffer;} либо выделять буфер на стеке char buffer[100];
тут при создании массива в него сохраняется его размер
но он не динамический
Зачем сохранять размер Дин массива ? Тогда и переменные нужно для контроля
а зачем во многих функциях C в параметрах буфер и его размер?
кста а зачем в стл такой класс нужен? какую задачу он решает? обработку исключений при не правильном индексе? и все? єто ж воще бесполезній клас
Потому что тогда еще не изобрели классы, чтоб передавать экземпляр класса, а не вот это вот всё.
#include <vector> #include <iostream> int main(){ std::vector<char> buffer(100); buffer[0] = 't'; buffer[1] = 'e'; buffer[2] = 's'; buffer[3] = 't'; buffer[4] = '\0'; std::cout << buffer.size() << std::endl; return 0; }
Удобная замена массивов в стиле C, с размером и итераторами
Спасибо, это все работает, но я с указателями разбираюсь 🙂
дает интерфейс вектора для массива
Верно :) и потому, что другого способа определить размер буфера нет.
Если Дин массив то значит мы не знаем его размера значит переменная
Если он расширится как узнать о дополнительно выделенной памяти ?
указатели указывают на объекты
Указатели указывают на память, а что там - определяется типом указателя.
на какую память указывает nullptr
У nullptr свой тип, так что он как раз и указывает на невалидную память?
А это разве указатель? Оно скорее литерал, вроде?
Почему невалидную? Это вообще валидное значение указателя
А это не обертка над NULL разве?
Ну, в общем да. Замена NULL с осмысленным типом.
Но физически ведь нет области памяти с адресом 0?
но NULL это не 0 же.
По разному, это дефайн
In general, pointer is a type of a variable that stores a link to another object. https://en.cppreference.com/book/pointers
это - 0 #define NULL 0
у него есть свой тип, но здесь идет речь о том, что получается после приведения nullptr к указателю на нужный тип
В некоторых языках это называется None и мне кажется это более точное название
Это дефайн который каждый определяет как хочет
Хоба,
None єто кста обїект класса NoneType так что сравнивать єто такое себе занятие
http://eel.is/c++draft/expr#conv.ptr-1
Похоже на печатную машинку с турецким акцентом Остапа Бендера, в которой буква Е не работала. 🙂
Так на какую память тогда указывает нулевой указатель?
с точки зрения языка - на ту в которой не может быть валидных объектов
Она правда есть, просто пользовательскому процессу туда не попасть...
nullptr не указатель
В плюсах 0, может быть не интом, а скажем лонгом
ну в данном случае деталь не существенная
В си это возможно, в плюсах нет
Это в Си
в питоне? питон - динамическую типизацию имеет - это значит что мы можем в рантайме взять и поменять тип ссылки любой на None - и проверять тип просто - не None ли он. Плюсы и си - статичискую типизацию имеют, то есть если на этапе компиляции определено что указатель имеет тип такой - мы не можем сказать в рантайме - "а теперь это становится типом None" - соответственно пометить как либо мы можем только через значение
Это точное название в другом языке
Обсуждают сегодня