Подтвердить что ты не робот

Массив указателя и размер путаницы

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

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

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

4b9b3361

Ответ 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.

Ответ 2

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

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

Ответ 3

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

Ответ 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

Ответ 5

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

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

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