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

时间:2009-10-20 04:01:05

标签: c

我写了一个测试程序,认为p1的地址小于p2,但是当我编译代码时,p2的地址变得更低(p1比p2大8个单位)。我还听说有传言说2个相邻的内存块会自动组合起来。这是否在以下代码中起作用?

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

5 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:8)

malloc可以从堆中的任何位置给你一个指针;它完全取决于它如何分配内存。

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

答案 2 :(得分:4)

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

但是,在您的程序中,您将使用对字符串文字的引用覆盖malloc地址引用。它们分配在图像的静态存储器中; malloc没有参与。

答案 3 :(得分:1)

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

此外,两个相邻的块将不会合并,因为很难确定如何释放它们,两个指针中的哪一个可以自由调用?

答案 4 :(得分:1)

“p1将小于p2”属于“未定义”的范围。仅当p1和p2指向同一数组或结构中的元素时,才会定义p1 < p2之类的内容。