Почему следующее кодирует вывод 4?
char** pointer = new char*[1];
std::cout << sizeof(pointer) << "\n";
У меня есть массив указателей, но он должен иметь длину 1, не так ли?
указатель
является указателем. Это размер указателя, который в вашей системе составляет 4 байта.
* указатель
также является указателем. sizeof (* указатель)
также будет 4.
** указатель
является символом. sizeof (** указатель)
будет 1. Обратите внимание, что ** указатель является символом, потому что он определен как char **
. В это значение входит размер массива new`ed nevers.
Обратите внимание, что sizeof
- оператор компилятора. Он преобразуется в константу во время компиляции. Все, что может быть изменено во время выполнения (например, размер нового массива), не может быть определено с помощью sizeof
.
Примечание 2: если вы определили это как:
char* array[1];
char** pointer = array;
Теперь указатель
по существу имеет то же значение, что и раньше, но теперь вы можете сказать:
int arraySize = sizeof(array); // size of total space of array
int arrayLen = sizeof(array)/sizeof(array[0]); // number of element == 1 here.
sizeof
всегда возвращает количество байтов.
Здесь указатель
является ... ошибочным ... указателем и имеет 32 бита на 32-битных архитектурах, то есть 4 байта.
sizeof
не дает вам размер динамических массивов (размер которых определяется только во время выполнения , и может быть разного размера во время разных выполнений).
sizeof
всегда вычисляется на времени компиляции и дает вам размер рассматриваемого типа, в данном случае это char **
- указатель (к указателю).
Ваша задача - отслеживать размер динамически выделяемых массивов (в первую очередь вы знаете, сколько вы запросили). Поскольку это обременительно, тем больше причин использовать контейнеры и строковый класс, которые сами отслеживают размер выделения.
указатель
имеет тип char **
, который имеет размер 4
, что вам может понадобиться, это char * указатель [ 1]
, но чтобы получить длину такого массива, вам понадобится следующий код
int len = sizeof (pointer) / sizeof (char *)
проверьте это:
int * pArr = new int[5];
int Arr[5];
sizeof(pArr); //==4 for 32 bit arch
sizeof(Arr); //==20 for 32 bit arch
sizeof(Arr)/sizeof(int); //==5 for any arch
Когда вы вызываете sizeof, вы спрашиваете, насколько он велик в байтах. Указатель на самом деле представляет собой целое число, которое представляет адрес, на котором находятся данные, на которые вы указываете, и предполагая, что вы используете операционную систему x32, размер int составляет 4 байта.