为什么内存地址有间隙?

问题描述 投票:0回答:1

我写了这段代码

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = malloc(10 * sizeof(int)); // 40 bytes 2940229680 - 2940229719
    printf("%p\n", ptr);
    char *block1 = (char *)malloc(10); // 10 bytes 2940229728 - 2940229737
    printf("%p\n", block1);
    void *block2 = malloc(10); // 10 bytes 2940229744 - 2940229753
    printf("%p\n", block2);
    return 0;
}

正如你所看到的,与我的预期不同,第二个和第三个分配的位置不是连续的。他们的地址之间有差距。例如,我认为 block1 变量将在 2940229720 之后使用。但它使用 2940229728。你能解释一下为什么吗?

Exp。为什么地址会这样。

c pointers memory malloc heap-memory
1个回答
0
投票

正如你所看到的,与我的预期不同的是,第二个和第三个分配 地方不是连续的。他们的地址之间有差距。

你的期望是错误的。然后你使用

malloc
,这取决于实现如何将其放置在内存中。你不应该期待任何事情。

如果你想确保内存是连续的,你需要分配更大的内存块并分配指针(你需要小心,因为你可能会遇到对齐问题)

int main() {
    unsigned char *raw = malloc(10 * sizeof(int) + 10 + 10);
    int *ptr = (int *)raw; 
    printf("%p\n", (void *)ptr);
    char *block1 = raw + 10 * sizeof(int);
    printf("%p\n", block1);
    void *block2 = raw + 10 * sizeof(int) + 10;
    printf("%p\n", block2);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.