как вычислить размер памяти указателя?
в одной функции я написал:
char *ab;
ab=malloc(10);
потом в другой функции я хочу знать размер памяти, на который указывает ab
указатель.
Есть ли способ, которым я могу это узнать?--1--> указывает на 10 символов памяти?
9 ответов
это глубокий секрет, который только free() знает наверняка. Это, вероятно, в вашей системе, но полностью зависит от реализации.
немного неловко, но если вы хотите сохранить все вместе:
typedef struct { // size of data followed by data (C only trick! NOT for C++) int dimension; // number of data elements int data[1]; // variable number of data elements } malloc_int_t; malloc_int_t *ab; int dimension = 10; ab = malloc( sizeof(*ab) + (dimension-1)*sizeof(int) ); ab->dimension = dimension; ab->data[n] // data access
Я изменил тип данных int чтобы сделать код более общего шаблона.
нет, у вас нет стандартного способа сделать это. Вы должны передать размер указанной памяти вместе с указателем, это общее решение.
т. е. вместо
void f(char* x)
{
//...
}
использовать
void f(char *x, size_t length)
{
//....
}
и в коде
char *ab = malloc( 10 );
f( ab, 10 );
вы не можете (переносно в любом случае). Вы должны следить за размером сами.
некоторые реализации malloc
может дать вам API для доступа к этой информации, но в стандарте для этого нет никаких положений.
нет.
теперь, как говорится, есть не портативные хаки для этого, но на них небезопасно полагаться.
Если вы знаете со 100% уверенностью, что память была выделена через malloc (), вы можете перемотать указатель на несколько байтов и проверить "узел malloc", который используется для отслеживания, какие части памяти были выделены, а какие нет. Однако я не могу подчеркнуть этого достаточно-никогда не полагайтесь на это.
размер-это то, что вы прошли в malloc
, вы можете использовать глобальную переменную или макрос, чтобы помнить его.
невозможно вывести размер выделенной памяти из самого указателя. С ab
Это char *
, sizeof(ab)
это то же самое, что sizeof(char *)
, что, очевидно, не совпадает с размером выделенного куска памяти.
так ты назвала malloc
с требуемым размером, вы знаете, что размер. Передайте это число вместе с указателем на функцию, которая должна знать размер.
У меня была структура и указатель char, указывающий на ее адрес памяти. Поэтому, связывая это с вашим вопросом, я хотел найти размер местоположения памяти, на которое он указывал, т. е. размер структуры. Поэтому логически, что вы делаете, это найти размер объекта, на который создается указатель. Это сработало для меня:
unsigned char * buffer= Library1Structure;
int x=sizeof(Library1Structure);
таким образом, значение x сообщает мне размер местоположения памяти, на которое указывает буфер указателя.