C 中的指针混乱

问题描述 投票:0回答:2
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a = 4;
    int *p = malloc(sizeof(int) * a);
    int *g = malloc(sizeof(int) * a);
    p += 8;
    printf("%p\n", p);
    printf("%p\n", g);
    
}

我已经运行这个程序好几次了,每次最后打印的p和g的值都是相同的。我不太确定为什么会发生这种情况 - 理论上 malloc 不能选择内存中的任何位置来让 p 和 g 指向?为什么 p + 8 总是等于 g?任何澄清将不胜感激。

谢谢!

c pointers
2个回答
2
投票

我已经运行这个程序好几次了,每次最后打印的p和g的值都是相同的

这是因为你的内存分配方式不同。

第一个

malloc
为4个整数分配内存。假设它们各有 4 个字节,那么就是 16 个字节。

0              1              2              3 
0123456789abdef0123456789abdef0123456789abdef0123456789abdef
^--------------
p

第二个

malloc
为另外4个整数分配内存。该内存可以分配在任何空闲插槽中,但它恰好是这样的。

0              1              2              3 
0123456789abdef0123456789abdef0123456789abdef0123456789abdef
^--------------               ^--------------
p                             g

如果将 8 添加到

p
,则会将其移动 8 个整数的大小,即 32 个字节,即
g

间隙中的记忆里有什么?谁知道。可以按照

malloc
认为合适的方式分配内存。


但是,不能保证内存会以这种方式分配。在我的系统上

p += 4
工作意味着没有间隙。


0
投票

malloc
在堆上保留所谓的chunks的内存,其大小可以是可变大小(固定大小的标头+可变大小的数据)

malloc
将 2 个块彼此相邻放置以防止内存泄漏是合乎逻辑的,并且将它们放在一起也很有意义,因为这是管理可用内存的最有效方法。
malloc
希望避免空闲内存的分段。

但是,由于您为每个

malloc
分配了 4 个整数,但每个块都有开销并且实际上大于 4 个字节,因此为 8 个而不是 4 个整数递增指针,将指针放置在下一个分配的数据的相同地址处。

这是一张图片:

Malloc会放置这2块内存

© www.soinside.com 2019 - 2024. All rights reserved.