用C语言顺序分配内存

用C语言顺序分配内存,c,memory,malloc,C,Memory,Malloc,我想测试malloc(),看看分配给同一个地址两次是否会增加内存,或者只是替换内存:int*ptr=malloc(sizeof(int));ptr=malloc(2*sizeof(int))此内存是3整数还是只有2整数? 当我测试可以容纳多少个整数时,我得到大约200个,之后在运行时会出现错误有人能解释一下内存分配的随机性吗 这个内存是3整数还是只有2整数 ptr当您重新分配到ptr时,ptr将指向两个ints的内存,以前的内存位置现在丢失,内存泄漏。malloc只需将void指针返回到分配的内

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

这个内存是3整数还是只有2整数


ptr
当您重新分配到
ptr
时,ptr
将指向两个
int
s的内存,以前的内存位置现在丢失,内存泄漏。

malloc只需将void指针返回到分配的内存。
2*sizeof(int)
将分配2*sizeof(int)
字节
表示两个整数的内存。 最初只为一个整数分配内存,然后在为两个整数分配内存的同一指针上再次分配内存。因此,最后它将指向两个整数大小的空间。

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

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

内存分配没有随机性


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

“两次分配到同一地址”?,我没有理解。您将地址存储在
ptr
中,分配的内存大小不强制执行!你可以写整数直到你的系统/程序崩溃。你不能“两次分配到同一个地址”,事实上这是不可能的。您正在分配两个对象并泄漏其中一个。也许你还没有发现realloc。@David Heffernan:他可以就地分配来验证他的“两次相同地址”理论。@CodeClown请详细说明“就地分配”的含义。很好地提到了这个漏洞。通过随机性,我指的是我可以在一个假定的4字节内存块中容纳200个整数。我杜撰这实际上是一个程序崩溃,把它和另一个错误混淆了。@kundrata如果我理解正确,将
200
int
s写入一个只分配了4个字节的指针是未定义的行为,如果你继续写,很可能会导致崩溃。啊,这解释了很多。您没有在问题中解释您当时试图写入超过分配范围的内容。这确实是“未定义的行为”,崩溃是通常的结果,但并非总是如此,因此具有随机性。通常,您可能会出现一些偏差,因为您仍在自己的内存中(但这当然可能会导致其他代码出现问题),但一旦您超出进程内存,操作系统将大声反对。