malloc是否将内存从0分配到正无穷大?

malloc是否将内存从0分配到正无穷大?,c,C,我编写了一个测试程序,认为p1的地址将小于p2,但当我编译代码时,p2的地址变低了(p1比p2大8个单位)。我还听说两个相邻的内存块会自动合并。这在下面的代码中起作用吗 void main(){ char *p1, *p2; p1=malloc(4); p2=malloc(5); p1="yah"; p2="goog"; printf(" p1 = %d, and p2 = %d \n", p1, p2); } malloc可以从堆中的任何位置为

我编写了一个测试程序,认为p1的地址将小于p2,但当我编译代码时,p2的地址变低了(p1比p2大8个单位)。我还听说两个相邻的内存块会自动合并。这在下面的代码中起作用吗

void main(){
    char *p1, *p2;
    p1=malloc(4);
    p2=malloc(5);
    p1="yah";
    p2="goog";
    printf(" p1 = %d, and p2 = %d \n", p1, p2);
}

malloc
可以从堆中的任何位置为您提供指针;如何分配内存完全取决于实现


指针值仅限于地址空间范围(因此,在32位地址空间中,指针值不会大于2^32-1)。

您打印的不是从malloc返回的地址,而是字符串文本(静态分配)的地址。如果要填充块,请使用strcpy;不过,打印地址时不需要这样做


另外,使用%p打印指针。

操作系统将确定如何满足malloc要求,因为您的程序的分配超出了您明确要求的范围,并且无法保证在何处分配,因为这不是物理内存,而是指向将映射到物理内存的某个虚拟内存的指针

另外,两个相邻的块不会合并,因为这样很难确定如何释放它们,两个指针中的哪一个将被释放?

malloc(3)
从操作系统获取内存,因此操作系统和程序链接的方式决定了
malloc(3)
可以使用的地址。因为malloc循环使用内存,所以您可能正在重用旧的分配,或者它可能只是决定先分配更高的地址


但是,在程序中,可以使用对字符串文本的引用覆盖malloc地址引用。这些被分配在图像的静态内存中;malloc没有参与。

“p1将小于p2”属于“未定义”范畴。只有当p1和p2指向同一数组或结构中的元素时,才会定义像
p1

这是否意味着p2有时大于p1,p1有时大于p2?谢谢。记忆可以在任何地方,很有可能,是的。但是,正如Martin指出的,您没有正确复制字符串,并且正在打印指向静态字符串文本的指针;实际上,在OP的节目中并没有发生这种情况。我同意这是不寻常的。从技术上讲,我们不知道malloc向他返回了什么指针,因为正如您所指出的,他没有打印指向malloc的块的指针。是的,您实际上已经丢弃了由
malloc
返回的地址,用其他地址替换它们。您的意思是使用
strcpy(char*dst,const char*src)
复制到从
malloc()
返回的缓冲区。由于分配的指针未被释放,这是否会导致内存泄漏?是的。指针p1被分配到字符串“yah”的静态内存位置,在打印指针位置时也使用%p。@klynch:请记住将指针转换到
(void*)
printf(“%p\n”,(void*)p)
。连续内存空间在释放后会合并在一起,并且所有权会再次传递给操作系统。True,但在malloced时不会合并,因此问题在于如何释放它们。