动态分配内存

动态分配内存,在堆(heap)中分配。

void *malloc(unsigned int num_bytes);
  • 头文件 stdlib.h或malloc.h
  • 向系统申请分配size个字节的内存空间
  • 返回void* 类型(未确定类型的指针)
  • 可强制转换为任何类型的指针
void *memset(void *s,int c,size_t n)
  • 头文件 string.h或memory.h
  • 将内存空间s的前n个字节的值设为值c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void getResult(char *pp) {
pp = (char *)malloc(10);
memset(pp, 0, 10);
strcpy(pp, "函数内");
}
void testMalloc() {
char *p = NULL;
getResult(p);
printf("getResult()后:%s\n", p); p = (char *)malloc(10);
memset(p, 0, 10);
strcpy(p, "调用方");
printf("%s\n", p);
} int main(int argc, char *argv[]) {
testMalloc();
return 0;
}

二级指针

二级指针——指向指针的指针

如果要在函数中申请内存,调用放还想得到申请的新内存的话,需要使用二级指针:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int g_size = 20; //申请新的内存空间
void _exploit(char **pp) {
*pp = (char *)malloc(g_size);
memset(*pp, 0, g_size);
strcpy(*pp, "函数内的新空间");
} //释放内存空间
void _giveBack(char **pp) {
if (*pp != NULL) {
free(*pp);
*pp = NULL;
}
} main() {
char *p = NULL;
_exploit( &p );
printf("【%s】\n", p);
_giveBack(&p);
printf("【%s】\n", p); p = (char *)malloc(g_size);
memset(p, 0, g_size);
strcpy(p, "调用方的新空间");
printf("【%s】\n", p);
_giveBack(&p);
printf("【%s】\n", p);//不加【】不打印(null),加了才打印
}

lloc系列函数

malloc 动态分配内存,需要与memset配合使用
calloc 动态分配完内存后,自动初始化内存空间为零
realloc 为数组重新分配内存
#include<stdio.h>
#include<stdlib.h>
main() {
char *p = NULL;
printf("p:%s\n", p);
p = (char *)malloc(10);
printf("p:%s\n", p);
if (p!=NULL) {
free(p);
p=NULL;
}
p = (char *)calloc(10,sizeof(char));
printf("p:%s\n", p);
if (p!=NULL) {
free(p);
p=NULL;
}
printf("p:%s\n", p);
}
#include <stdio.h>
main() {
char arr[3];
int n = 1;
int i = 1;
printf("n = %d\n", n);
char *p = &arr[0];
char *p2 = realloc(p, 10);
for(i = 0; i<10; i++) {
arr[i] = 9;
}
printf("n = %d\n", n);
}

释放内存

  • malloc等内存分配函数开辟的内存来自于堆(heap),
  • 堆是有限的,不能只开辟,不释放,
  • 使用free函数释放不使用的内存。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void testMalloc() {
char *p = (char *)malloc(10);
memset(p, 0, 10);
strcpy(p, "调用方");
printf("p:%s\n", p);
if(p != NULL) {
free(p);
p = NULL;
}
printf("p:%s\n", p);
} int main(int argc, char *argv[]) {
testMalloc();
return 0;
}

示例:猜价格

知识点:

  • 内存管理
  • 二级指针
  • 循环
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getResult(int n, char **pp) {
int nRealPrice = 2999;
*pp = (char *)malloc(10);
memset(*pp, 0, 10);
if (n > nRealPrice) {
strcpy(*pp, "高了");
return 0;
} else if (n < nRealPrice) {
strcpy(*pp, "低了");
return 0;
} else {
strcpy(*pp, "正确");
return 1;
}
} void setFree(char **pp) {
if(*pp != NULL) {
free(*pp);
*pp = NULL;
}
} void guessPrice() {
int n = 0;
char *p = NULL;
int nRet = 0; do {
scanf("%d", &n);
nRet = getResult(n, &p);
printf("p:%s\n", p); setFree(&p);
printf("p:%s\n", p);
} while(nRet == 0 );
}
int main(int argc, char *argv[]) {
guessPrice();
return 0;
}

模拟Java的ArrayList的add()方法

ArrayList又叫动态数组,长度不够的时候可以自动申请新的内存。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int capacity = 3;
static int index = 0;
void foreach(char * p) {
puts("");
for(int i = 0; i<=index; i++) {
printf("%c ", *(p+i));
}
puts("");
}
void add(char **p, char c) {
if (*p == NULL) {
*p = (char*)calloc(capacity, sizeof(char));
} else {
if(index >= capacity ) {
capacity += (capacity>>1);
printf("新容量:%d \n", capacity);
char *p2 = (char*)realloc(*p, capacity);
//free(*p);
*p = p2;
}
}
*(*p+index) = c;
index++;
//printf("index = %d \n",index);
}
main() {
char* p = NULL;
int n = 1000;
for(int i = 0; i<20; i++) {
add(&p, 'A');
foreach(p);
}
printf("int = %d \n", n);
}

C语言讲义——内存管理的更多相关文章

  1. JVM内存管理------JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  2. C语言的内存管理

    C语言的内存管理 转载:http://blog.csdn.net/wind19/article/details/5964090   对于一个C语言程序而言,内存空间主要由五个部分组成代码段(.text ...

  3. C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针

    C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针 (1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放.造成内存泄露,以下的样 ...

  4. R语言之内存管理

    转载于:http://blog.csdn.net/hubifeng/article/details/41113789 在处理大型数据过程中,R语言的内存管理就显得十分重要,以下介绍几种常用的处理方法. ...

  5. JVM内存管理之JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  6. c语言之内存管理

    在计算机系统,特别是嵌入式系统中,内存资源是非常有限的.尤其对于移动端开发者来说,硬件资源的限制使得其在程序设计中首要考虑的问题就是如何有效地管理内存资源.本文是作者在学习C语言内存管理的过程中做的一 ...

  7. C语言精华——内存管理,很多学校学习不到的知识~

    在编写程序时,通常并不知道需要处理的数据量,或者难以评估所需处理数据量的变动程度.在这种情况下,要达到有效的资源利用--使用内存管理,必须在运行时动态地分配所需内存,并在使用完毕后尽早释放不需要的内存 ...

  8. C语言回顾-内存管理和指针函数

    1.fgets()函数 该函数是一个文件操作相关的函数 暂时使用这个函数可以从键盘上接收一个字符串,保存到数组中 char str[50]; 1)scanf("%s",str);/ ...

  9. [Objective-C语言教程]内存管理(36)

    内存管理是任何编程语言中最重要的过程之一.它是在需要时分配对象的内存并在不再需要时取消分配的过程. 管理对象内存是一个性能问题; 如果应用程序不释放不需要的对象,则应用程序会因内存占用增加并且性能受损 ...

随机推荐

  1. AWS Lambda 借助 Serverless Framework,迅速起飞

    前言 微服务架构有别于传统的单体式应用方案,我们可将单体应用拆分成多个核心功能.每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作时不会互相影响 这种设计理念被进一步应用,就变成了无 ...

  2. 使用AI技术获取图片文字与识别图像内容

    获取图片文字 如何使用python获取图片文字呢? 关注公众号[轻松学编程]了解更多- 1.通过python的第三方库pytesseract获取 通过pip install pytesseract导入 ...

  3. day82:luffy:课程详情页面显示&章节和课时显示&视频播放组件&CKEditor富文本编辑器

    目录 1.初始课程详情页面 2.视频播放组件 3.课程详情页面后端接口实现 4.课程详情页面-前端 5.CKEditor富文本编辑器 6.课程章节和课时显示-后端接口 7.课程章节和课时显示-前端 1 ...

  4. Python 3.9就要来了......,令人兴奋的时刻

    本文主要介绍Python3.9的一些新特性,如:更快速的进程释放,性能的提升,简便的新字符串函数,字典并集运算符以及更兼容稳定的内部API,详细如下: 字典并集和可迭代更新 字符串方法 类型提示 新的 ...

  5. Torrent文件的解析与转换

    Torrent简介 BitTorrent协议的种子文件(英语:Torrent file)可以保存一组文件的元数据.这种格式的文件被BitTorrent协议所定义.扩展名一般为".torren ...

  6. ASP.NET Core 中基于工厂的中间件激活

    IMiddlewareFactory/IMiddleware 是中间件激活的扩展点. UseMiddleware 扩展方法检查中间件的已注册类型是否实现 IMiddleware. 如果是,则使用在容器 ...

  7. linux 进程间通信 共享内存 mmap

    共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间.进程A可以即时看到进程B对共享内存中数据的更新,反 ...

  8. kafka事务

    Kafka 从 0.11 版本开始引入了事务支持.事务可以保证 Kafka 在 Exactly Once 语义的基 础上,生产和消费可以跨分区和会话,要么全部成功,要么全部失败. 开启幂等性的 Pro ...

  9. MySQL慢查询开启、日志分析(转)

    说明 Mysql的查询讯日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应时间超过阈值的语句 具体指运行时间超过long_query_time值得SQL,则会被记录到慢查询日志中.lon ...

  10. 定位一个网络问题引起的ceph异常

    前言 有一个ceph环境出现了异常,状态就是恢复异常的慢,但是所有数据又都在走,只是非常的慢,本篇将记录探测出问题的过程,以便以后处理类似的问题有个思路 处理过程 问题的现象是恢复的很慢,但是除此以外 ...