动态分配内存

动态分配内存,在堆(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. 跟我一起学.NetCore之MediatR好像有点火

    前言 随着微服务的流行,而DDD(领域驱动设计)也光速般兴起,CRQS(Command Query Responsibility Seperation--命令查询职责分离).领域事件名词是不是经常在耳 ...

  2. BP神经网络算法程序实现鸢尾花(iris)数据集分类

    作者有话说 最近学习了一下BP神经网络,写篇随笔记录一下得到的一些结果和代码,该随笔会比较简略,对一些简单的细节不加以说明. 目录 BP算法简要推导 应用实例 PYTHON代码 BP算法简要推导 该部 ...

  3. 简单粗暴套娃模式组json发送https请求

    各位童鞋大家好,向来简单粗暴的铁柱兄给大家来玩一手套娃模式来组Json数据,不说别的,无脑套. 当然,这一手比较适合临场用一下,若长期用的话建议搞一套适用的框架,只管set就好了.话不多说开始上课. ...

  4. 840. Magic Squares In Grid ——weekly contest 86

    题目链接:https://leetcode.com/problems/magic-squares-in-grid/description attention:注意给定的数字不一定是1-9. time: ...

  5. uniapp使用axios以及封装错误重试解决方案

    在uniapp中,使用axios进行请求时,uniapp无法使用axios的适配器,需要基于uni.request来定义适配器. 安装完成axios后在项目utils目录下建一个axios文件夹 文中 ...

  6. c#连接mysql答题步骤

    引用mysql数据库 using MySql.Data.MySqlClient; 有一个mysql.dll文件 下面是实例化连接数据库 MySqlConnection Conn = new MySql ...

  7. 用数组实现队列(顺序队列&循环队列)

    用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...

  8. iOS开发 objective C 代码布局

    代码布局抛弃storyboard,用代码生成界面,它的优劣不谈 首先在项目设置中,更改应用的"入口" 不选main,清空它 然后在AppDelegate.m中,更改(添加内容),别 ...

  9. 简单STL

    string: string s="5418340"; sort(s.begin(),s.end()); cout<<s; /**begin是头迭代器,end是尾迭代器 ...

  10. nginx&http 第三章 ngx 1-http ngx_http_wait_request_handler

    对于活跃的 HTTP 连接,在执行连接建立回调函数 ngx_http_init_connection 的过程中会执行 ngx_http_wait_request_handler 回调函数, 负责 HT ...