Массив указателей и размер путаницы - PullRequest
12 голосов
/ 03 августа 2010

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

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

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

Ответы [ 5 ]

19 голосов
/ 03 августа 2010

pointer - указатель.Это размер указателя, который составляет 4 байта в вашей системе.

*pointer также является указателем.sizeof(*pointer) также будет 4.

**pointer - символ.sizeof(**pointer) будет 1. Обратите внимание, что указатель ** является символом, потому что он определен как 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.
5 голосов
/ 03 августа 2010

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

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

3 голосов
/ 03 августа 2010

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

2 голосов
/ 03 августа 2010

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

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

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

2 голосов
/ 03 августа 2010

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...