Как мы можем найти размер памяти из данного указателя памяти? - PullRequest
5 голосов
/ 03 октября 2010
void func( int *p)
{
  // Add code to print MEMORY SIZE which is pointed by pointer P.
}
int main()
{
  int *p = (int *) malloc (10);
  func(p);
}

Как узнать размер ПАМЯТИ из указателя памяти P в функции ()?

Ответы [ 5 ]

10 голосов
/ 03 октября 2010

Нет легального способа сделать это на C (или даже на C ++, я считаю).Да, каким-то образом free знает, сколько было malloc отредактировано, но делает это таким образом, который невидим или недоступен для программиста.Для вас, программиста, это могло бы быть сделано с помощью magic !

Если вы решите попытаться декодировать то, что делает malloc и free, то это приведет вас к дороге кпроприетарные реализации компилятора.Имейте в виду, что даже в одной и той же ОС разные компиляторы (или даже разные версии одного и того же компилятора или даже один и тот же компилятор, но использующий стороннюю реализацию malloc (да, такие вещи существуют)) могут делать это по-разному.

3 голосов
/ 03 октября 2010

При разработке приложений, чтобы узнать объем памяти, выделенный для указателя, мы фактически обращаем внимание на момент, когда мы выделяем для него память, которая в вашем случае равна:

int *p = (int *) malloc(10);

, а затем мы сохраняем этоинформация где-то, если нам нужно использовать ее в будущем.Как то так:

void func(int *p, size_t size)
{
  printf("Memory address 0x%x has %d bytes allocated for it!\n", p, size);
}

int main()
{
  int my_bytes = 10;
  int *p = malloc(my_bytes);
  func(p, my_bytes);

  return 0;
}
2 голосов
/ 04 октября 2010

Много лет назад я программировал на UNIX-подобную систему, которая имела функцию msize stdlib, которая возвращала бы в значительной степени то, что вы хотите. К сожалению, он никогда не стал частью какого-либо стандарта.

msize вызов по указателю, возвращенному из malloc или realloc, вернул бы фактический объем памяти, выделенный системой для пользовательской программы по этому адресу (который может быть больше, чем было запрошено, если он был округлен для выравнивания или что-то в этом роде.)

1 голос
/ 03 октября 2010

Если вы программируете для Microsoft Windows, вы можете использовать функции Windows API Heap * вместо функций, предоставляемых вашим языком программирования (C в вашем случае). Вы выделяете память с HeapAlloc, перераспределяете с HeapReAlloc, освобождаете память с HeapFree и, наконец, получаете размер ранее выделенного блок с функцией HeapSize.

Другой вариант, конечно, - написать функции-оболочки для malloc и друзей, которые хранят индекс выделенных блоков и их размеры. Таким образом, вы можете работать со своими собственными функциями для выделения, перераспределения, освобождения и измерения блоков памяти. Написание таких функций-обёрток должно быть тривиальным (хотя я не знаю C, поэтому я не могу сделать это для вас ...).

0 голосов
/ 04 октября 2010

Во-первых, как уже говорили все остальные, не существует переносимого способа узнать размер распределения, если вы не сохраните эту информацию.

Все, что имеет значение, это реализация стандартной библиотеки C. Большинство библиотек сохраняют только размер памяти, выделенной для указателя, который обычно больше размера, который запрашивает ваша программа. Позволить библиотеке сохранить запрошенный размер - плохая идея, потому что это требует дополнительной памяти, и порой мы не заботимся о запрошенном размере.

Строго говоря, запись запрошенного размера НЕ является особенностью компилятора. Иногда это происходит потому, что компилятор может переопределить часть стандартной библиотеки и переопределить системную настройку по умолчанию. Однако я бы не стал использовать запрошенный размер записи в библиотеке, потому что он, вероятно, будет занимать больший объем памяти по причине, указанной выше.

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