Как рассчитать размер указателя памяти? - PullRequest
7 голосов
/ 26 июля 2011

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

char *ab; 

ab=malloc(10);

Затем в другой функции я хочу узнать размер памяти, на который указывает указатель ab. Могу ли я узнать, что ab указывает на 10 символов памяти?

Ответы [ 9 ]

7 голосов
/ 26 июля 2011

Нет, у вас нет стандартного способа сделать это.Вы должны передать размер указанной памяти вместе с указателем, это общее решение.

Т.е. вместо

void f(char* x)
{
    //...
}

используйте

void f(char *x, size_t length)
{
    //....
}

и в вашем коде

 char *ab = malloc( 10 );
 f( ab, 10 );
3 голосов
/ 26 июля 2011

Это глубокий секрет, который наверняка знает только 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 , чтобы сделать код более универсальным шаблоном.

2 голосов
/ 26 июля 2011

Вы не можете (в любом случае переносимо). Вы должны сами следить за размером.

Некоторые реализации malloc могут предоставить вам API для доступа к этой информации, но в стандарте для этого нет положений.

1 голос
/ 26 июля 2011

Нет.

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

1 голос
/ 26 июля 2011

Нет, к сожалению.

Вам необходимо передать размер блока вместе с указателем.

1 голос
/ 26 июля 2011

Нет способа, вам нужно сохранить размер выделенной памяти в другой переменной.

0 голосов
/ 21 октября 2013

У меня была структура и указатель на символ, указывающий на его адрес памяти.Поэтому, соотнося это с вашим вопросом, я хотел найти размер области памяти, на которую он указывал, т.е. размер структуры.Итак, логично, что вы делаете, найдите размер объекта, на который указывает указатель.Это сработало для меня:

 unsigned char * buffer= Library1Structure;
 int x=sizeof(Library1Structure);

Так что значение x говорит мне размер ячейки памяти, на которую указывает буфер указателя.

0 голосов
/ 26 июля 2011

Нет способа определить размер выделенной памяти из самого указателя. Поскольку ab является char *, sizeof(ab) совпадает с sizeof(char *), что, очевидно, не совпадает с размером выделенного фрагмента памяти.

Поскольку вы позвонили malloc с нужным размером, вы знаете, какой это размер. Передайте это число вместе с указателем на функцию, которая должна знать размер.

0 голосов
/ 26 июля 2011

Размер - это то, что вы передали malloc, вы можете использовать глобальную переменную или макрос, чтобы запомнить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...