Массив указателей и sizeof беспорядок

Почему следующее кодирует вывод 4?

char** pointer = new char*[1];
std::cout << sizeof(pointer) << "\n";

У меня есть массив указателей, но он должен иметь длину 1, не так ли?

12
задан Peter Mortensen 29 November 2010 в 12:05
поделиться

5 ответов

указатель является указателем. Это размер указателя, который в вашей системе составляет 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.
19
ответ дан 2 December 2019 в 04:52
поделиться

sizeof всегда возвращает количество байтов.

Здесь указатель является ... ошибочным ... указателем и имеет 32 бита на 32-битных архитектурах, то есть 4 байта.

5
ответ дан 2 December 2019 в 04:52
поделиться

sizeof не дает вам размер динамических массивов (размер которых определяется только во время выполнения , и может быть разного размера во время разных выполнений).

sizeof всегда вычисляется на времени компиляции и дает вам размер рассматриваемого типа, в данном случае это char ** - указатель (к указателю).

Ваша задача - отслеживать размер динамически выделяемых массивов (в первую очередь вы знаете, сколько вы запросили). Поскольку это обременительно, тем больше причин использовать контейнеры и строковый класс, которые сами отслеживают размер выделения.

2
ответ дан 2 December 2019 в 04:52
поделиться

указатель имеет тип 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
2
ответ дан 2 December 2019 в 04:52
поделиться

Когда вы вызываете sizeof, вы спрашиваете, насколько он велик в байтах. Указатель на самом деле представляет собой целое число, которое представляет адрес, на котором находятся данные, на которые вы указываете, и предполагая, что вы используете операционную систему x32, размер int составляет 4 байта.

3
ответ дан 2 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: