Как рассчитать конечный адрес блока памяти, выделенного malloc? - PullRequest
0 голосов
/ 21 ноября 2011

Все, что мы знаем, malloc возвращает начальный адрес выделенного блока памяти, но мне хотелось бы узнать, как подсчитать конечный адрес этого блока

  int *p, *q;
  p=malloc(4*sizeof(int));
  q=p+4;

Теперь q будет указывать на блок конечного адреса, но яхотел бы иметь какой-то другой подход для получения конечного адреса блока памяти, выделенного malloc.

Edit

Еще одна вещь, которую я хотел бы знать здесь, это способ сделатьуверен, что мы в конце выделенного блока

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011

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

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

2 голосов
/ 21 ноября 2011

Код, который вы написали (p = p + 8), будет иметь p, указывающий за пределы конца, так как вы выделили пространство для 4-х дюймов, но сместили указатель на 8 (не байт).

Oneспособ сделать это тривиален:

size_t const SIZE = 4;
int *p;
p=malloc(SIZE*sizeof(int));
p=p+SIZE;

Теперь нет ошибок, и, скорее всего, нет будущего.

1 голос
/ 28 июля 2012

Немного поздний ответ, но я полагаю, что для этого нужно упомянуть: для Visual Studio вы можете использовать _msize () для вычисления числа, переданного malloc() (или количества байтов, выделенных new x, если вы используете C ++).Он работает только для указателей, выделенных в куче, поэтому _malloca(), alloca(), char x[2]; не будут работать.

1 голос
/ 21 ноября 2011

Если вы просто хотите узнать, сколько места вы запросили, вам не повезло, поскольку это не является частью контракта malloc(3) '.Некоторые конкретные реализации malloc поддерживают API для этого, но это не переносимо.

Так что вы не сможете, если не напишите свой собственный malloc.

Если вы действительно хотите узнать общееОбъем выделенной памяти, вам еще больше не повезло.Если malloc возвращает значение p для размера q, то хранилище может начинаться с любого p-X и расширяться до p-X+q+Y для любых значений X и Y, которые разработчики malloc сочли удобными для своихсобственные издержки.

Правильный способ обнаружения ошибок в использовании указателя - использовать такой инструмент, как valgrind.

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