c - 在 C 中使用 malloc 进行内存分配

标签 c memory pointers malloc

这是我的程序:

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

main(){
   char *p1, *p2, *p3, *p4;

   p1 = (char*)malloc(10);
   p2 = (char*)malloc(10);
   p3 = (char*)malloc(16);
   p4 = (char*)malloc(32);

   printf("p1 points at: %d\n", p1);
   printf("p2 points at: %d\n", p2);
   printf("p3 points at: %d\n", p3);
   printf("p4 points at: %d\n\n", p4);

   system("PAUSE");
}

这会在我的电脑上产生以下输出:

p1 指向:6492080

p2 指向:6492104

p3 指向:6492128

p4 指向:6492152

因此,无论分配了多少字节,malloc 分配的每个内存空间都从 24 字节开始。这是为什么?我感谢您的帮助!

最佳答案

malloc 的确切行为由您的特定实现(编译器/libc/OS)决定。通过打印出地址,您的程序参与了未定义的行为。

如果您通过告诉我们您使用的是什么编译器、您使用的是什么操作系统、什么体系结构以及您使用的是什么版本的 libc 来缩小您的问题范围,那么我们也许能够给出更具体的答案该实现以及为什么数字是 24。

我的猜测 是,在您的实现中,每个malloced 内存区域需要从一个地址开始,该地址是 8 的倍数,并且还有 8字节的开销。

编辑:如果你再次调用malloc在p4之后创建p5,这个模式肯定不能继续,所以你的语句“malloc分配的每个内存空间从24字节开始此外,无论分配了多少字节。”是假的。

关于c - 在 C 中使用 malloc 进行内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12989806/

相关文章:

java - 用Java 存储数据。文本文件、csv 还是其他方法?

java - 在 Java 中查找内存使用情况

c - 指向动态指针数组的指针指向指向字符串的动态指针数组

c - 函数内二维数组的动态分配(使用指针返回分配对象的地址)

c - 可以使用静态链接使用的库构建共享库吗?

c - 引用后的结构定义如何合法?

php - 为 windows 编译 PHP 扩展

flash - ActionScript 3 Profiler 和内存分析工具

c - 从函数返回 char* 和 char[] 有什么区别?

c 指向结构数组的指针