как вычислить размер памяти указателя?

в одной функции я написал:

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