C语言 动态内存分配机制(堆区) int*p=malloc(5*sizeof(4))

C程序内存分配图

栈区:局部变量
堆区:动态分配的数据
静态存储区/全局区:全局变量,静态数据
代码区:代码,指令
在这里插入图片描述

内存分配说明

在这里插入图片描述

内存动态分配的相关函数

堆区:
#inlcude<stdlib.h>

Malloc(size);//分配长度为size个字节的连续空间

Calloc(n,size);//分配size个长度为n个字节的连续空间,总共有size*n个字节

Free§;//销毁指针p所指向的堆空间,其他函数和主函数不能再使用

Realloc(p,size);//重新分配指针p所指向的内存空间大小,指针所指向的地址不变,仅仅是空间扩大或缩小
在这里插入图片描述
在这里插入图片描述

Void*:

Void*:仅仅是一个纯地址,而不指向任何的对象:
Void* p;//无类型指针变量
如果是void类型,不能够用p来取得值(报错)
在这里插入图片描述
void*强制类型转换举例:
在这里插入图片描述

代码

#include<stdio.h>
//动态内存分配(堆区)--void*无类型指针int main()
{int a=102;int *pa=&a;//类型转换1char b='c';char *pb=&b;void *p;char *pc;char *pd;p=(void*)pb;//强制类型转换,char*pb-->void*,并把pb地址赋值给ppc=(char*)p;//强制类型转换,void*p-->char*pd=(char*)pa;//记住:没有*p,p只是一个地址,不指向任何对象printf("类型转换1:\n");printf("pb=%c address=%p self-address=%p\n",*pb,pb,&pb);printf("p:address=%p self-address=%p\n",p,&p);printf("pc=%c address=%p self-address=%p\n",*pc,pc,&pc);printf("pd=%c address=%p self-address=%p\n",*pd,pd,&pd);getchar();return 0;
}

说明:
在C99的编译器中,其他类型转void*类型,是自动类型转换:
int a=2;
void *p=&a;
低版本的则需要强制类型转换:
void *p=(void *)&a;

应用案例

在这里插入图片描述

代码

#include<stdio.h>
#include<stdlib.h>
//动态内存分配(堆区)--malloc()函数
//输出所有成绩中小于60的成绩
#define SIZE 5
void check(int *p,int len);//函数原型,函数声明
int *check1(int *p,int len);int main()
{int *p=(int*)malloc(5*sizeof(int));//开辟5*4大小的空间,相当于一个长度为8的数组int i=0;//*p=-842150451是一个垃圾值,堆区的第一个字节,4个字节才存储一个元素,因此不能使用*pprintf("address=%p self-address=%p\n",*p,p,&p);printf("输入每一个成绩:\n");while(i<5){//p+i=arr[0]+i的地址//通过数组的地址来为数组每一个元素赋值scanf("%d",p+i);i++;}printf("方式1:\n");//输出成绩1check(p,5);//输出成绩2int*k=check1(p,5);printf("\n方式2:\n");for(i=0;i<5;i++){if(*k!=0){printf("%d",*k);k++;}}getchar();//entergetchar();return 0;
}
void check(int *p,int len)
{int i;for(i=0;i<len;i++){if(p[i]<60){printf("%d ",p[i]);}}}int *check1(int *p,int len)
{static int i,j=0,arr[SIZE];//局部数据,使用静态staticfor(i=0;i<len;i++){if(p[i]<60){arr[j++]=p[i];}}return arr;
}

图示
在这里插入图片描述

练习–逆序输出字符串

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//动态内存分配(堆区)--函数练习
//malloc()分配内存空间
//realloc()重新分配内存空间
//free()释放内存空间char *reverse(char *s,int len);//函数声明
//逆序打印字符串
const int size=100;
int main()
{char *p=(char*)malloc(size*sizeof(char));//为p动态分配内存空间char s[size];gets(s);int len=strlen(s);char *p=(char*)realloc(p,len*sizeof(char));//重新为p分配更合适的内存空间//p=k[0]的地址(char*)p=reverse(s,len);int i;for(i=0;i<len;i++){printf("%c",*p+i);//或p++}free(p);//释放p所指向的内存空间getchar();//entergetchar();return 0;
}
//逆序字符串
char *reverse(char *s,int len)
{int i=len-1,j=0;static char k[size];while(i>=0){k[j++]=s[i];i--;}return k;
}

基本原则

1)每开辟一个内存就会占用系统开销,所以需要避免分配大量小内存块
2)内存泄漏:没有释放内存空间,这一个内存空间就会一直被占用
3)开辟了动态内存后一定要记得释放:谁分配,谁释放
在这里插入图片描述

指针使用一览

指针数组:
由n个指向整型元素的指针而组成,里面存放指针
Int *ptr[3];

数组指针:
指向一个有n个元素的数组的指针,里面存放的是整型变量(int类型长度为n的数组的首地址),存的是一个数组地址,而不是单个元素
int(*p)[n]

int (*p)(int ,int):指向函数的指针

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ primer 第15章 面向对象程序设计

文章目录前言OOP&#xff1a;概述继承动态绑定定义基类和派生类定义基类成员函数与继承访问控制与继承定义派生类派生类中的虚函数派生类对象及派生类向基类的类型转换派生类构造函数派生类使用基类的成员继承与静态成员派生类的声明被用作基类的类防止继承的发生类型转换与继承…

服务器密码机部分文件的介绍学习

相关文件包 automake,autoconf使用详解

C语言 结构体 struct Cat cat1;

引入 使用传统技术解决 需要定义多个变量或数组 结构体与结构体变量的关系示意图 类似Java类中的对象(结构体)与属性(结构体变量) 一切物体都可以看作对象(结构体) 补充:C语言数据类型 简单使用案例 代码 Cat是我们自己定义的数据类型 struct Cat cat1;//创建struct Cat的…

boost Filesystem Library Version 3关于文件的一些函数封装 fsync()函数

boost boost Filesystem Library Version 3boost::filesystem使用方法,根据路径创建文件夹使用boost.filesystem检查文件是否存在的正确方式std::filesystem::temp_directory_path关于C#:与boost :: filesystem :: unique_path()等效的C 17是什么?C++ 檔案、資料夾、路徑處理…

c++面向对象高级编程 总目录

本文是对学习侯捷视频 c面向对象高级编程系列博客的目录总索引。 c面向对象高级编程 学习一 不带指针的类&#xff1a; 访问私有成员变量的方式&#xff0c;内联inline&#xff0c;常量成员函数&#xff0c;构造函数&#xff0c;值传递&#xff0c;引用传递&#xff0c;操作符…

C语言 共用体/联合体 union

引入 传统技术的缺陷—结构体 共用体基本介绍 共用体与结构体一样都是值传递 定义共用体的三种方式 内存布局 共用体数据空间占用最大的成员的数据空间大小 案例解析 1) 2) 3) 4) 注: 1010 1101 0101 0100所对应的十进制是负数 计算机中的二进制都是以补码存储的,所…

C++ Makefile文件详解

什么是Makefile文件 一个工程&#xff0c;源文件不计其数&#xff0c;按照类型、功能、模块分别放在对应的若干个目录中Makefile定义了一系列的规则&#xff0c;比如定义文件编译的先后顺序。类似shell脚本&#xff0c;也可以执行操作系统的命令Makefile带来的好处是自动化编译…

C语言 项目练习-家庭收支软件

目标 需求说明 界面说明 登记收入界面: 登记支出界面 收支明细界面 退出界面 项目代码改进要求 自己完成的代码 版本1 #include<stdio.h> #include<string.h> void choose(int button,int i); //项目--家庭收支软件 static double total10000;//总金额 #de…

c++ fmt 库安装和使用示例、clion配置

安装 git clone https://github.com/fmtlib/fmt.gitmake .mkae && make install CLion使用 使用和安装存在出入下载源码&#xff0c;可以先 clone 到你的项目中去&#xff0c;https://github.com/fmtlib/fmt &#xff0c;我放到的是项目的 dependencies 目录然后在…

C语言 项目 CRM系统(客户信息管理系统)

项目目标 项目需求说明 系统界面 1)添加客户界面 通过编号来区分客户 2)删除客户界面 对用户输入的编号进行核查,存在与否,合法与否 3)显示客户列表界面 4)修改客户信息的界面 项目设计 Customer结构体的设计 CRM系统结构框架图 案例代码 #include <stdio.h>…

代码重构 防火墙 相关知识

参考 依据Linux命令以及sysconf下现有的iptables命令&#xff0c;详见hsm_sysconf_server/src/sysconf_server.cpp中的firewall规则。 接口名称 firewall_manager 目的(现实) 根据网口直连获取当前eth0和eth1的各种信息保证设置的正确性 以及要针对管理口和服务口设计不…

C语言 文件的基本介绍

基本介绍 输入流与输出流 重点在C程序(内存)的数据移动方向 对于C程序(内存) 输入数据:输入流 输出数据:输出流 输入 和输出 C标准库 标准输入输出库 标准文件 getchar()&putchar()函数 代码 #include<stdio.h> #include<stdlib.h> //文件--getchar()和…

ubuntu修改字体 样式

使用 快捷键 ctrlaltt 打开终端安装gnome-tweaks桌面管理工具 sudo apt install gnome-tweaksaltf2 在运行窗口输入 gnome-tweaks 命令&#xff0c;然后回车打开优化窗口&#xff0c;选择第二个front字体选项ubuntu显示中文

C语言 文件的读写

引入 OS操作系统 打开文件fopen()函数 读写模式: r:读取已有文件 w:文件不存在,创建文件并写入文件.文件存在,内容清零,再写入文件 a: 文件不存在,创建文件并写入文件.文件存在,以追加的形式写入文件 r:读写已有文件 w:文件不存在,创建文件并读写文件.文件存在,内容清零,再…

StarWind V2V Image Converter:虚拟机镜像转换工具,可将 IMG 文件转换为 VMware VMDK 文件

操作流程 选择本地的需要转换的文件找到源文件的路径&#xff0c;img格式选择转化后的格式 第一个选择 第二个 速度快一些选择将转化后的文件的存储路径软件的下载链接 链接: https://pan.baidu.com/s/1Fe6yI42Zz9d_Q7aUhGe1FQ 提取码: 5vmv

数学建模基础知识

原型与模型 模型的分类 数学建模 数学建模的分类 成为建模大神 数学建模比赛 数学建模一般步骤 数学建模全过程 数学建模论文写作 1&#xff09;摘要:是决定最后获奖等级的关键 2&#xff09;问题重述:使用自己的语言将问题重述一次 3&#xff09;符号说明:对于常见的或…

数学建模 线性规划模型基本原理

线性规划问题 例1.1 可行解&可行域 matlab标准形式及软件求解 标准形式: C称为价值向量 如果是求max,加一个负号-c^T 如果是求Ax>b,加一个负号-Ax<b 使用matlab求线性规划例题 求解的是最大值:加上负号 y是求解的最优解 zeros()使用: zeros(n)&#xff1a;生…

接上文 ,解决 虚拟机VM,U盘(磁盘)装有系统,将其中系统安装到另外一块磁盘的具体操作

问题原因&#xff1a;接上文&#xff0c;将生成的vsdk格式的磁盘导入VM创建镜像&#xff0c;相关于U盘装载系统镜像&#xff0c;将U盘其中的镜像导入到磁盘里边&#xff0c;U盘是引导&#xff0c;会将系统最终装载到磁盘出错原因是因为 没有新建第二块磁盘 解决 新增一块磁盘如…

数学建模 层次分析法

简介 针对多目标,多准则或无结构特性的复杂决策问题 步骤 解决评价类问题 评价类问题: 资料查找: 1)查找相关文献 2)如果没有找到相关文献 3)搜索 通过上述步骤后得到的结果 构建层次结构模型 举例: 成对比较矩阵 标度表: 奇数:越大越重要 偶数:上述两相邻判断的中值…