郝斌老师c语言学习笔记----动态内存分配
2017-11-30 20:55
246 查看
动态内存分配
1. 传统数组的缺陷
(1)传统数组的内存空间不能手动释放
一个数组被创建后在这个函数没有运行完毕时会一直存在当这个函数运行完毕后,这个数组所占用的内存空间被释放
(2)长度必须事先指定,且只能是常数,不能是变量
int a[5]; //正确 int a[len]; //错误
(3)数组的长度一旦定义,其长度就不能更改
无法再函数运行期间去改变数组的长度大小(扩容、缩容)(4)不能够跨函数使用
函数运行期间,可以调用这个函数内部的数组,函数一旦运行完毕,这个数组就不可以再被使用2 . 为什么使用动态内存
动态内存就很好解决了上述的四个问题3 . malloc函数的使用
代码如下#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.int * p = (int *)malloc(4)这条语句一共分配了8个 字节,其中int * p 占4个字节(静态内存) (int *)malloc(4)占4个字节 5.malloc函数返回的是第一个字节的地址 */ *p = 5; printf("p = %d", p); free(p); printf("p = %d", p); return 0; }
4. 用malloc函数动态构造一维数组
构造一个可以自己指定长度的数组
#include<stdio.h> #include<malloc.h> int main(void){ int len; int * p; printf("请输入要创建数组的长度:\n"); scanf("%d", &len); p = (int *)malloc(len * sizeof(int)); //给数组赋值 for(int i=0; i<len; i++) { printf("请输入第%d个值:", i); scanf("%d", &(*(p+i))); } printf("\n"); //数组输出 printf("第一种输出方法:\n"); for(i=0; i<len; i++) { printf("%d,", p[i]); } printf("\n"); printf("第二种输出方法:\n"); for(i=0; i<len; i++) { printf("%d,", *(p+i)); //p[i]永远等于*(p+i) } printf("\n"); free(p); return 0; }
5. 动态内存跨函数使用
(1)多级指针
//多级指针简单的小程序 int main(void) { int i = 5; int * p =&i; //p 是 int *类型 int ** q = &p; //q 是 int **类型 int *** r = &q; //r 是 int ***类型 printf("%d", ***r); //此时 ***r 指向的是i } /* 输出结果: 5 */
(2)动态内存跨函数使用
void f(int ** q) { *q = (int *)malloc(sizeof(int)); //建立动态内存 **q = 5; //赋值 } int main(void) { int * p; f(&p); printf("%d", *p); //动态内存当函数执行完毕,如果不进行free它依然可以被其他函数使用 return 0; } /* 输出结果 : 5 总结: (1)对于静态内存,当函数执行完毕后,静态内存所占用的空间将不可以被其他函数使用 (2)对于动态内存,如果不进行free操作,当函数执行完毕依旧可以被其他函数所调用 (3)较为深入的可以理解为: 静态内存存放在栈中,动态内存存放在堆中 */
相关文章推荐
- 郝斌老师C语言学习笔记----基本类型指针
- 郝斌老师C语言学习笔记----补码和位运算符
- 郝斌老师C语言学习笔记----指针和数组
- 郝斌老师C语言学习笔记(一)
- c语言学习笔记-控制流-郝斌老师讲解
- 动态内存分配 学习笔记2
- C语言学习笔记-数组-郝斌老师讲解
- C语言学习笔记-指针-郝斌老师讲解
- 《C++ Primer Plus》第12章 类和动态内存分配 学习笔记
- 2012/1/27 《C++ Primer Plus》第十二章:类和动态内存分配 学习笔记
- 2012/1/27 《C++ Primer Plus》第十二章:类和动态内存分配 学习笔记
- Perl语言学习笔记 13 目标操作
- Go语言并发与并行学习笔记(一)
- 学习笔记 Java_毕向东_语言基础_程序流程控制 2014.7.29
- OC语言疯狂讲义学习笔记
- 汇编语言学习笔记(一)
- R语言可视化学习笔记之添加p-value和显著性标记
- Go语言学习笔记 -- 内建函数
- 【黑马程序员】 学习笔记 - 直击7K面试题 - 张孝祥老师的交通等管理系统
- 汇编语言学习笔记(十二)-浮点指令