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