我写了一个测试程序,认为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);
}
答案 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
之类的内容。