-1

我想测试malloc()两次分配给同一个地址是否会增加内存,或者只是替换它:int *ptr = malloc(sizeof(int)); ptr = malloc(2*sizeof(int));
这个内存是 3 ints 大还是只有 2 ?
当我测试可以容纳多少个整数时,我得到了大约 200 个,之后在运行时出现错误。
有人可以解释内存分配的随机性吗?

4

3 回答 3

2

malloc()假设内存可用,则始终分配您请求的大小的新内存块。它返回一个指向它分配的内存的第一个字节的指针,以便您可以使用它。当您进行第二次malloc()调用时,它会覆盖指向您在第一次分配的内存的指针,因此您无法再访问它 - 但它仍然存在并且仍然分配给您。这通常称为内存泄漏,因为您的进程已经获取了内存,然后尽管不再使用它,但没有将其归还。

所以在你第二次调用之后,你已经分配了足够的内存来存储三个整数,在两个单独的块中,其中第一个不能再被访问,因为你没有指向它的指针了。

内存分配没有随机性。

我不确定为什么在达到 200 个整数时会出现运行时错误,除非您的进程的内存可用性非常有限。了解您实际遇到的错误会有所帮助。

于 2013-06-12T11:39:46.267 回答
1

这个内存是 3 ints 大还是只有 2 个?

ptrint当您重新分配给以前的内存位置时,将指向内存 2秒,ptr现在丢失并且该内存已泄漏。

于 2013-06-12T11:37:23.303 回答
0

malloc 只是将 void 指针返回到分配的内存。2*sizeof(int)将分配 2*sizeof(int)bytes表示两个整数的内存。最初,您只为一个整数分配了内存,然后又在同一指针上为两个整数分配了内存。所以最后它将指向两个整数大小的空间。

于 2013-06-12T11:37:56.447 回答