malloc函数的使用

malloc函数的使用include stdio h 先讲最基本的语法 最后是完整的例子 2021 5 309 30malloc 是 memory 内存 allocate 分配 的缩写 请求分配内存 include malloc h malloc 在 malloc h 文件中放着 intmain void inti 5 14 行 分配了 4 个字节静态分配 malloc h stdio h

# include

//先讲最基本的语法,最后是完整的例子

# include 
  
    # include 
   
     int main(void) { int i = 5; int * p = (int *)malloc(4); *p = 5; free(p); printf("同志们好!\n"); return 0; } 
    
  

/*

 

    2021/5/30   9:30

malloc 是memory(内存)  allocate(分配)的缩写(请求分配内存)

 

*/

 

# include

//malloc在malloc.h 文件中放着

 

int main(void)

{

int i = 5;                   // 14行

// 分配了4个字节 静态分配

 

int * p = (int *)malloc(4);            // 17行 

// p 指向4个字节,但p本质上只保存了第一个字节地址,

4个字节只用首地址表示,int *类型已经让我们知道是4个字节为一个变量单元了

 

// p本身身为指针变量只能指向第一个字节地址,

但是 p 前面定义了数据类型 int ,达到的效果是 p 可以指向4个

 

   //p 本身的4个字节内存和malloc分配的4个内存是不是一样的内存(动态?静态)

//不是  p 是 静态(数据类型+变量名) ,malloc (p 是栈里面的, malloc是堆里面的)

 

   /*

  1、要使用malloc函数,必须添加malloc.h这个头文件

 

 2、malloc函数只有一个形参,并且是形参是整型

 (系统定义的时候,有几个形参)(一个,实参只有一个,形参就只有一个),

如果实参一个形参两个,程序会报错。

 

 3、4表示请求系统为本程序分配4个字节,malloc(必须是整数),字节不可能是3个半

 

 4、malloc函数只能返回第一个字节的地址,

那第一个字节的地址有没有实际意义– 没有,除非定义 数据类型

 

 5、malloc函数分配了4个字节,而且只能返回第一个字节地址给 p

 也就是系统通过 p 调用 malloc 函数时,通过 p 的值来确定malloc 函数的地址,

而malloc函数默认返回第一个字节地址

 

 假设 p 刚好指向某个存储地址(一横代表一个字节地址),

因为malloc 函数刚好返回这一字节地址 (连续分配空间的4个字节的第一个字节地址(首地址))

 

 那这时候,    p 到底占几个字节, p 指向的变量到底占几个字节?

(你不知道在4个字节里头,从第一个字节开始怎么去分配这4个字节,是一个个呢,还是2个2个,还是直接4个就当整体用了)

 

 第一个字节地址本身不能确定它指向的变量到底占几个字节(不能确定它的大小)

 

(int *)malloc(4);把第一字节地址(这个地址本身无实际意义(malloc函数返回的第一个字节类型是void),

不加强制类型转换,地址的位数不能确定

 

 因为你连它是什么类型都不知道,这时候要强制转换成有实际意义的地址,可以让人们使用,看的懂)

强制转换成  一个 整型的地址(int *)

 

 (char*)malloc(100);  // 返回100个字节,一个字节一个变量

 

 (int*)malloc(100);   //  返回值还是一样的,还是第一个字节地址,

但是它知道第一个字节地址代表是整型变量的地址,

 

 mlloc函数就知道虽然只有第一个字节地址但是它知道按4个字节,

4个字节发放分配,最后整体100个字节是25个变量

 

malloc函数虽然返回了第一个字节的地址,但它表示的不是第一个字节的地址,

而是整型变量字节的地址,整型变量的地址肯定是4个,4个字节划分的

 

【注意】这里说的是如果(   )malloc前面不定义数据类型,

就无法确定指针变量所指向第一个字节的地址类型

 

 

   最终分配几个字节:

   p 也是个变量,有空间,需要4个字节保存,地址就是内存单元的编号,有32根地址总线来组合

(一个指针变量无论它指向的变量占几个字节,它本身都只占4个字节)

17行分配了8个字节, p 变量占4个字节,  p 所指向的内存也占4个字节(malloc所分配的)

 

6、 p 本身所占的内存(字节)是静态分配的,p 所指向的内存是动态分配的

 

   */

 

*p = 5;

// *p 是动态分配的 ,* p 表示的是 malloc所使用的 4个字节内存

// 代表的就是一个int 变量,只不过 *p 这个整型变量的内存分配方式和  14行 的 i 变量的分配方式不同

 

 

free(p);  // 终止 动态内存

// free(p); 表示把 p 所指向的内存(字节)给释放掉 ,p本身是静态的,指向地址字节是动态的

 

//本来这4个字节属于当前 叫malloc 的程序使用,所谓分配,

就是4个字节的使用权限给malloc了;而释放就是4个字节内存不能再用,不能写和读

 

//p本身的内存是静态的,不能由程序员手动释放,p 本身的内存(所占的字节)

只能再 p 变量所占的函数运行终止是由系统自动释放

 

printf(“同志们好!\n”);

 

return 0;

}

       

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227092.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:57
下一篇 2026年3月16日 下午9:58


相关推荐

  • IDEA快捷键设置复制上一行

    IDEA快捷键设置复制上一行Idea真是的一个神奇的ide,用着爱不择手。之前用习惯了eclipse的“ctrl+向下箭头”,复制一行,如何设置idea里这个快捷键呢File->settings->keymap->搜索duplicate->双击DuplicateEntireLines设置一下,搞定,又可以很爽的用ctrl+向下箭头复制一行了虽说以上的一种解决方法,但是经…

    2022年5月14日
    435
  • ubuntu 18.04 EM7345 4G 模块接入点删除「建议收藏」

    ubuntuEM7345创建多个接入点如何删除本人TinkPadT440P笔记本,装了ubuntu18.04,前几天一激动,买了一个M2接口的EM7345,支持联通3G/4G,电信4G,都能正常使用,我一不小心建了许动连接点,本人有洁癖,但又不知道怎么删除,后来找了好几天,找到以下路径,又这方面需求的同学,可以参考一下/etc/NetworkManager/syst…

    2022年4月12日
    183
  • centos7配置ip地址

    关于centos7获取IP地址的方法主要有两种,1:动态获取ip;2:设置静态IP地址在配置网络之前我们先要知道centos的网卡名称是什么,centos7不再使用ifconfig命令,可通过命令IPaddr查看,如图,网卡名为ens32,是没有IP地址的1、动态获取ip(前提是你的路由器已经开启了DHCP)修改网卡配置文件vi/etc/sysconfig/netwo…

    2022年4月9日
    48
  • PHP SOCKET编程

    PHP SOCKET编程

    2022年2月12日
    46
  • beego 注册账号发送邮件验证激活

    beego 注册账号发送邮件验证激活常见 SMTP 服务器端口 smtp comsmtp 163 com25126smtp 126 com25 需要开启邮箱的 SMTP 服务 知道 smtp 密码控制器注册方法 发送激活邮件 config username password smtp 密码 host smt

    2026年3月17日
    3
  • IOCTL函数用法

    IOCTL函数用法ioctl 的实现 nbsp 一 ioctl 的简介 虽然在文件操作结构体 structfile operations 中有很多对应的设备操作函数 但是有些命令是实在找不到对应的操作函数 如 CD ROM 的驱动 想要一个弹出光驱的操作 这种操作并不是所有的字符设备都需要的 所以文件操作结构体也不会有对应的函数操作 nbsp 出于这样的原因 ioctl 就有它的用处了 一些没办法归类的函

    2026年3月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号