我写了这段代码
#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。为什么地址会这样。
正如你所看到的,与我的预期不同的是,第二个和第三个分配 地方不是连续的。他们的地址之间有差距。
你的期望是错误的。然后你使用
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;
}