c语言学习之基础知识点介绍(十九):内存操作函数
一、malloc函数
/*
首先需要导入头文件 #include <stdlib.h>
malloc
void* malloc(n); n是字节大小
开辟堆空间,开辟的字节数以n为准
返回的是开辟空间的首地址
void*是万能指针,也就是说你可以用任意类型的指针去指向 */ //malloc用法 int *p = malloc(sizeof(int)); *p = ; printf("%p %d\n",p,*p);//0x100105490 char *pc = malloc(sizeof(char)*); pc[]= 'a'; pc[] = 'b'; pc[] = 'c'; pc[] = '\0'; printf("%s\n",pc); char *pc = malloc(); *pc = 'a'; *(pc+) = 'b'; *(pc+) = 'c'; *(pc+) = '\0'; printf("%s\n",pc); char *pc = malloc();
char *temp = pc; *pc = 'a';
pc++; //自身+1 *pc = 'b'; pc++;
*pc = 'c'; pc++;
*pc = '\0'; printf("%s\n",temp); char *pc = malloc(); *pc = 'h'; printf("%c\n",*pc);
二、calloc函数
//calloc用法 int nums[] = {,,};//在栈区
int *p = calloc(, );//在堆区
p[] = ;
p[] = ;
p[] = ;
for (int i =; i<; i++) {
printf("%d\n",p[i]);
} int *p = calloc(, );//在堆区 *(p) = ;
*(p+) = ;
*(p+) = ; for (int i =; i<; i++) { printf("%d\n",p[i]);
}
malloc和calloc的区别:
malloc不会初始化,会有垃圾值,calloc会初始化为0
char *pch = malloc(); for (int i =; i<; i++) { printf("%d ",*(pch+i));
} printf("\n------------分割线-------------\n"); char *pch2 = calloc(, ); for (int i =; i<; i++) { printf("%d ",*(pch2+i));
}
三、realloc函数
/*
当自己手动开辟出来的空间不够用了,这个时候我们需要去扩容,就得用到realloc这个函数。 realloc:
realloc(要扩容的空间首地址,操作后的字节大小); 作用:把你传入的空间进行扩容或者缩小,操作后的字节大小以后面的参数为准。 注意:用realloc函数的时候最好再用指针变量接收一下返回值。
因为你扩容的时候,很可能是系统帮你在一块新的足够大的空间里面进行扩容了,那样空间首地址就发生改变了。 */ //realloc的使用
char *p = malloc(); *p = "的手机客户端还是把空间分布的刷卡缴费多少部分科技的设备房间号多少功夫空间都是给我看一个";
//所以要重新接收一下
p = realloc(p, );//放大
p = realloc(p, );//缩小
四、内存泄露
/*
内存泄露:
内存容量有限,然后如果你不及时回收不要用的空间,而是一直开辟新的空间,那么内存就会不够用,就叫内存泄露(像水杯装水一样)。 代码里面:某块空间一直占据,没被回收就叫内存泄露。 回收自己开辟的堆空间:
free:
free(要回收的空间首地址); 野指针:指向的是已被回收的空间的指针叫野指针。指向不可用的内存空间叫野指针。 防止野指针:
就是在回收后,立即将指针变量置为NULL。
*/
int *p = malloc();//内存泄露 //因为没有对p指向的堆空间进行回收,所以就内存泄露 //那么程序自己怎么回收?? free(p);//此时p指向的空间首地址就被回收了,此时p变为野指针 p = NULL; //p指向的空间被回收后,要立即把p置为NULL,防止野指针错误
c语言学习之基础知识点介绍(十九):内存操作函数的更多相关文章
- c语言学习之基础知识点介绍(九):预处理指令和多文件开发
一:预处理指令 /* 预处理指令: 作用:在程序编译之前做一些操作. 预处理命令写法的共同特点:都是以#号开头. 文件包含指令:#include 是一个文件包含命令. 作用:把某个文件内的内容读取出来 ...
- c语言学习之基础知识点介绍(八):函数的基本用法
本节开始说函数. 一.函数的基本用法 /* 作用:可以实现代码的复用,在一定程度上解决代码冗余的问题:方便后期维护. 语法: void 函数名(){ 函数体; } 函数命名要有意义,遵守驼峰命名法. ...
- c语言学习之基础知识点介绍(三):scanf函数
本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...
- c语言学习之基础知识点介绍(二):格式化控制符和变量的补充
上节简单介绍了c语言中的一些基础知识点,本节将对之前介绍的不够详细的知识点进行补充. 格式化控制符的消息介绍: %d的其他控制符: 1.%md:m代表这个整数位占用多少位,m是一个整数.实际数字不足的 ...
- c语言学习之基础知识点介绍(六):if和switch结构
本节主要说c语言中的分支结构. c语言中分支结构有两大类:一种是if,一种是switch. 一.if结构 //if结构,语法: //第一种: if(表达式){ //语句块 } //第二种: if(表达 ...
- c语言学习之基础知识点介绍(十四):指针的进阶
一.指针的加.减法运算 /* 1.加法运算 1).可以跟整数进行加法运算,得到的还是一个地址 公式: 地址 + 1 = 地址 + 1 * 类型所占的字节数 地址 + n = 地址 + n * 类型所占 ...
- c语言学习之基础知识点介绍(十):数组
本节主要介绍数组. 一.数组 /* 数组:一个变量可以存n个变量. 语法:类型 数组名[长度(正整数)]; 例如:int score[5];//定义了一个int类型的数组,长度为5,可以保存5个数据. ...
- c语言学习之基础知识点介绍(二十):预处理指令
一.预处理指令的介绍 预处理命令:在编译之前触发的一系列操作(命令)就叫预处理命令. 特点:以#开头,不要加分号. #include: 文件包含指令 把指定文件的内容复制到相应的位置 #define: ...
- c语言学习之基础知识点介绍(十五):函数的指针
一.函数的指针的介绍 /* 函数指针: 函数的指针,本质上一个指针 指向函数的指针,就是一个函数指针. 回忆:我们写的源代码编译成二进制的指令集,一串交给CPU执行的指令 先存在内存里面,然后CPU读 ...
- c语言学习之基础知识点介绍(十二):结构体的介绍
一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类 ...
随机推荐
- 第K顺序统计量
1.第K顺序统计量概念 在一个由n个元素组成的集合中,第k个顺序统计量是该集合中第k小的元素.例如,最小值是第1顺序统计量,最大值是第n顺序统计量. 2.求Top K元素与求第K顺序统计量不同 Top ...
- 如何使用C#和VB发送和接收MSMQ消息
在这篇博客中,我们将就如何实现System.Messaging类发送和接收的XML消息发送从MSMQ队列,你可能会遇到接收的XML消息的一些问题. 我们将首先加入参考System.Messaging ...
- 动态链接库(DLL)的使用
2013-07-04 http://blog.csdn.net/blpluto/article/details/5715182 感觉挺好,推荐去看看.
- Msys下gcc的配置
打开文件/etc/profile,添加如下路径, C_INCLUDE_PATH=/e/msys/1.0/include export C_INCLUDE_PATH CPLUS_INCLUDE_PATH ...
- Codeforces295A - Greg and Array(线段树的成段更新)
题目大意 给定一个序列a[1],a[2]--a[n] 接下来给出m种操作,每种操作是以下形式的: l r d 表示把区间[l,r]内的每一个数都加上一个值d 之后有k个操作,每个操作是以下形式的: x ...
- 几乎每个文件里面都有 #ifdef __cplusplus extern "C" { #endif 可我没找到程序里那个地方定义了__cplusplus 啊?这又是怎么回事呢?
我们的C语言有个进化版,叫C++,这个想必楼主知道,Keil MDK是支持C++编程的,也就是说,你可以用C语言或者C++写你的程序,都可以. 但是,有一个问题,就是头文件的问题,C语言写的头文件C+ ...
- Ubuntu16.04编译安装php
#Ubuntu16.04编译安装php Ubuntu16.04上面搭建基于Nginx的php服务.Nginx使用apt直接安装的. sudo apt install nginx php的安装部署步骤主 ...
- codis集群和redis cluster的优劣对比
1.codis架构如下: (1)Codis是一整套缓存解决方案,包含高可用.数据分片.监控.动态扩态 etc..走的是 Apps->代理->redis cluster,一定规模后基本都采用 ...
- Away3D 的实体收集器Bug
最近在改Away3D源码的时候遇到个很郁闷的问题,发现创建的Mesh 释放不掉. 分析源码发现 EntityListItemPool 类中逻辑Bug在getItem()函数中发现_poolSize 对 ...
- 微软的.NET示例代码放在Github上了
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:微软的.NET示例代码放在Github上了.