我们都知道malloc返回已分配内存块的起始地址但是我想如何计算该块的结束地址
int *p, *q;
p=malloc(4*sizeof(int));
q=p+4;
现在q
将指向结束地址块,但我想有一些其他方法来获取malloc分配的内存块的结束地址。
修改
我想知道的另一件事是确保我们处于已分配块的末尾
答案 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];
将不起作用。