忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(6)动态内存分配
一、传统数组的缺点:
1、数组的长度必须事先定制,且只能是常整数,不能是变量
int len = 5; int a[len]; //error2、传统形式定义的数组,该程序的内存程序员无法手动释放
# include <stdio.h> void f(void){
int a[5] = {1, 2, 3, 4, 5};
//这二十个字节的存储空间程序员无法手动编程释放它
//只能在本函数运行完毕时由系统自动释放
} int main(void){
return 0;
}3、数组的长度不能在函数运行的过程中动态的扩充或缩小
4、A函数定义的数组,在A函数运行期间可以被其他函数使用,但A函数运行完毕后,A函数中的数组将无法被其他函数使用,静态数组不能跨函数使用。
# include <stdio.h>
void g(int *pArr, int len){
pArr[2] = 88;
}
void f(void){
int a[5] = {1, 2, 3, 4, 5}; //f运行期间g();函数可以使用
g(a, 5); //当f运行完毕数组a空间被释放
printf("%d\n", a[2]);
} int main(void){
return 0;
}
二、动态分配
为什么要动态分配?动态分配数组可以很好的解决上面四个问题。
举例:动态数组
/*
2012年2月5日15:00:25
malloc 是 memory(内存) allocate(分配)的缩写
*/
# include <stdio.h.
# include <malloc.h> //头文件 int main(void){
int i = 5; //静态分配了四个字节
int * p = (int *)malloc(4); //把返回的地址强制转换为整形变量的地址
/*
1.要使用malloc函数,必须添加malloc.h这个头文件
2.malloc函数只有一个形参,并且是整型
3.4表示请求系统为本程序分配4个字节
4.malloc函数只能返回第一个字节的地址
5.上面一行代码分配了8个字节,p变量占4个字节,p所指向的内存也占4个字节
6.p本身所占的内存是静态分配的,p所指向的内存是动态分配的
*/
*p = 5; //*p代表整形变量,只不过*p这个整形变量的内存分配方式和i分配不同
free(p); //表示把p所指向的内存给释放掉
printf("同志们好!\n"); return 0;
}# include <stdio.h>
# include <malloc.h> void f(int * q){
*q = 200;
free(q); //把q指向的内存释放掉 和 free(p)等价
}
int main(void){
int * p = (int *)malloc(sizeof(int));
*p = 10; printf("%d\n", *p); //10
f(p); //通过f()修改p指向内存的值
printf("%d\n", *p); //p指向的内存已经释放,所以会出错 return 0;
}/*
2012年2月5日15:37:36
动态一维数组示例
*/
# include <stdio.h>
# include <malloc.h> int main(void){
int a[5]; //包含20字节
int i;
int len;
int *pArr; printf("请输入你要存放的元素个数:");
scanf("%d", &len);
pArr = (int *)malloc(4*len); //pArr指向前4个字节 类似于 int pArr[len];
// pArr+1 就指向第5到第8个字节
//动态的构造了一个int类型的一维数组,数组名 pArr
for (i=0; i<len; i++) //对一维数组进行赋值
scanf("%d", &pArr[i]); printf("一维数组的内容是:\n");
for(i=0; i<len; i++)
printf("%d\n", pArr[i]); return 0;
}
输出结果:
请输入你要存放的元素个数:5
1 2 3 4 5
一维数组的内容是:
1
2
3
4
5
三、静态内存和动态内存的比较
静态内存是由系统自动分配,由系统自动释放
静态内存是在栈中分配的
动态内存是由程序员手动分配,手动释放
动态内存是在堆中分配的
# include <stdio.h> void f(int ** q){
int i = 5;
//*q 等价于p q 和**q都不等价于p
*q = &i;
}
int main(void){
int * p; f(&p); //访问完后释放内存
printf("%d\n", *p); //本语句语法没有问题, 但逻辑上有问题
//访问了不该访问的内存,f()函数结束后i的空间已经被释放
//静态变量,不能跨函数使用,当函数结束后变量不能被访问 return 0;
}# include <stdio.h>
# include <malloc.h> void f(int **q){
*q = (int*)malloc(sizeof(int)); //动态分配内存
//等价于 p = (int *)malloc(sizeof(int));
**q = 5;
} int main(void){
int * p;
f(&p);
printf("%d\n", *p); //f()结束后,p指向的动态内存没有释放 return 0;
}
忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(6)动态内存分配的更多相关文章
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(2)准备知识
一.变量为什么必须初始化? 在回答这个问题之前,我们先来运行一段代码: #include <stdio.h> int main(){ int i; printf("i=%d\n& ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(5)有趣的指针
一.指针是C语言的灵魂 # include <stdio.h> int main(){ int *p; //p是变量名,int *表示p变量存放的是int类型变量的地址,p是一个指针变量 ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(3)输入输出函数
一.基本的输入和输出函数的用法 1.printf() //屏幕输出 用法: (1)printf("字符串\n"); (2)printf("输出控制符", 输出 ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(1)GCC介绍及C语言编译过程
一.GCC基本介绍 GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器.它是一套以GPL及LGPL许可证所发布的自由软件,也是GNU计划的关 ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(9)链表
我们至少可以通过两种结构来存储数据 数组 1.需要一整块连续的存储空间,内存中可能没有 2.插入元素,删除元素效率极低. 3.查找数据快 链表 1.查找效率低 2.不需要一块连续的内存空间 3.插入删 ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(8)枚举、补码
一.枚举 # include <stdio.h> enum WeekDay //定义了一个数据类型(值只能写以下值) { MonDay, TuesDay, WednesDay, Thurs ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(7)结构体
一.为什么需要结构体? 为了表示一些复杂的事物,而普通类型无法满足实际需求 二.什么叫结构体? 把一些基本类型组合在一起形成的一个新的复合数据类型叫做结构体. 三.如何定义一个结构体? 第一种方式: ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(4)for == while ?
一.for和while等价替换 int i = 1; for (i; i<=100; i++){ sum = sum + 1; } int i = 1; while(i<=100){ su ...
- C语言学习笔记--动态内存分配
1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确 ...
随机推荐
- 7.Linux 输入子系统分析
为什么要引入输入子系统? 在前面我们写了一些简单的字符设备的驱动程序,我们是怎么样打开一个设备并操作的呢? 一般都是在执行应用程序时,open一个特定的设备文件,如:/dev/buttons .... ...
- HTML的SEO(搜索引擎优化)标准
HTML的SEO(搜索引擎优化)标准 一.总结 这个做seo的时候要多看,做网站优化的时候 1. SEO(搜索引擎优化):通过总结搜索引擎的排名规律,对网站进行合理优化,使你的网站在百度和Google ...
- loadrunner11 +Win7 + 支持ie9,录制成功
loadrunner11 支持ie9,录制成功 中文例子: https://wenku.baidu.com/view/1123925377232f60ddcca149.html http://blog ...
- USB串行端口
USB-SERIAL CH341A(COM22)USB串行端口
- 如何使用VS2008打开VS2010的解决方案
用记事本打开VS2010的SLN文件的修改开头代码: Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Stud ...
- PatentTips - Method, apparatus and system for instructing a virtual device from a virtual machine
BACKGROUND OF THE INVENTION A virtual machine (VM) may be or include a framework or environment crea ...
- WCF REST (二)
今天主要写下 POST等其他方式 发送请求 以及 流方式 文件的上传与下载 一.Post 提交数据 先来想下 POST和Get 的不同 Get 方式 我们直接通过 url 来传递参数 先来 ...
- 语言模型(Language Modeling)与统计语言模型
1. n-grams 统计语言模型研究的是一个单词序列出现的概率分布(probability distribution).例如对于英语,全体英文单词构成整个状态空间(state space). 边缘概 ...
- 如何在anaconda中切换python2
如果你不切换可能是默认的python3环境. 下面是在python27版本下下载qt5
- Altium Designer中原理图和pcb交叉查找
转自:https://wenku.baidu.com/view/53ca06badbef5ef7ba0d4a7302768e9951e76e33.html 再看看:::: 转自:http://blog ...