如何计算malloc分配的内存块的结束地址?

时间:2011-11-20 20:04:27

标签: c malloc

我们都知道malloc返回已分配内存块的起始地址但是我想如何计算该块的结束地址

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

现在q将指向结束地址块,但我想有一些其他方法来获取malloc分配的内存块的结束地址。

修改

我想知道的另一件事是确保我们处于已分配块的末尾

4 个答案:

答案 0 :(得分:3)

使用标准技术,只能使用指针作为输入,不能确定块结尾的位置。为了做到这一点。你必须检测你的分配器或使用提供这种功能的分配器。

当您使用malloc分配内存时,程序员必须完全负责跟踪您分配的内存量。您不能在稍后的某个时间点询问系统,告诉您有关内存块的任何信息。

答案 1 :(得分:2)

您编写的代码(p = p + 8)将指向超出结尾的p,因为您为4个整数分配了空间但是将指针移动了8个(整数,而不是字节)。

一种方法是微不足道的:

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

现在,没有错误,也不可能是未来的错误。

答案 2 :(得分:1)

如果你只想知道你要求多少空间,那你就不走运了,因为这不是malloc(3)'合同的一部分。 malloc的一些特定实现为此支持API,但它不是可移植的。

所以,除非你自己编写malloc

,否则你不能这样做

如果你真的想知道分配的内存总量,那么你的运气就更糟了。如果malloc返回大小为p的值q,则存储可以从任何p-X开始,并延伸到p-X+q+Y,对于X和Y的任何值, malloc的实现者发现他们自己的开销很方便。

检测指针使用错误的正确方法是使用像valgrind这样的工具。

答案 3 :(得分:1)

答案稍晚,但我认为这需要提一下: 对于Visual Studio,您可以使用_msize()计算提供给malloc()的数字(或new x分配的字节数,如果您使用的是C ++)。它只适用于在堆上分配的指针,因此_malloca()alloca()char x[2];将不起作用。