как вычислить размер памяти указателя?
в одной функции я написал:
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 сообщает мне размер местоположения памяти, на которое указывает буфер указателя.