c/c++动态分配内存 

为什么需要动态分配内存

---很好的解决的了传统数组的4个缺陷

动态内存分配举例

---动态数组的构造

使用动态数组的优点:   
1. 动态数组长度不需要事先给定;
2. 内存空间可以手动释放;
3. 在程序运行中, 动态内存空间大小可以通过realloc函数手动扩充或缩小

 静态内存和动态内存的比较  

静态内存是由系统自动分配,有系统自动释放

静态内存是在栈分配的

动态内存是由程序员手动分配,手动释放,动态内存是在堆分配的

动态内存和静态内存的比较

静态内存是由系统自动分配,由系统自动释放
静态内存是在栈分配的

动态内存是由程序员手动分配,手动释放
动态内存是在堆分配的

难点

/*
2009年11月17日10:21:31
malloc 是 memory(内存) allocate(分配)的缩写 */
# include <stdio.h>
# include <malloc.h> //不能省 int main(void)
{
int i = ; //分配了4个字节 静态分配 11 行
int * p = (int *)malloc(); //12行
/*
1. 要使用malloc函数,必须添加malloc.h这个头文件
2. malloc函数只有一个形参,并且形参是整型
3. 4表示请求系统为本程序分配4个字节
4. malloc函数只能返回第一个字节的地址
5. 12行分配了8个字节, p变量占4个字节, p所指向的内存也占4个字节
6. p本身所占的内存是静态分配的, p所指向的内存是动态分配的
*/ *p = ; //*p 代表的就是一个int变量, 只不过*p这个整型变量的内存分配方式和11行的i变量的分配方式不同
free(p); //freep(p)表示把p所指向的内存给释放掉 p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时由系统自动释放
printf("同志们好!\n"); return ;
}
malloc的用法:
demo1 .
# include <stdio.h>
# include <malloc.h> void f(int * q)
{
//*p = 200; //error
//q = 200;
//**q = 200; //error
*q = ;
//free(q); //把q所指向的内存释放掉 本语句必须的注释掉,否则会导致第20行的代码出错
} int main(void)
{
int * p = (int *)malloc(sizeof(int)); //sizeof(int)返回值是int所占的字节数
*p = ; printf("%d\n", *p); //
f(p); //p是int *类型
printf("%d\n", *p); //200 第20行 return ;
}

demo2.

# include <stdio.h>
# include <malloc.h> int main(void)
{
// int k;
int * p = (int *)malloc();
/*
malloc函数的返回值是void *
void * 也叫干地址 所谓干地址就是无实际意义的地址
*/ free(p); //把p指向的内存释放 return ;
}
动态一维数组示例:
# include <stdio.h>
# include <malloc.h> int main(void)
{
int a[]; //如果int占4个字节的话,则本数组总共包含有20个字节,每四个字节被当做了一个int变量来使用
int len;
int * pArr;
int i; //动态的构造一维数组
printf("请输入你要存放的元素的个数: ");
scanf("%d", &len);
pArr = (int *)malloc( * len); //第12行 本行动态的构造了一个一维数组, 该一维数组的产度是len, 该数组的数组名是pArr, 该数组的每个元素是int类型 类似于 int pArr[len]; //对一维数组进行操作, 如:对动态一维数组进行赋值
for (i=; i<len; ++i)
scanf("%d", &pArr[i]); //对位一维数组进行输出
printf("一维数组的内容是:\n");
for (i=; i<len; ++i)
printf("%d\n", pArr[i]); free(pArr); //释放掉动态分配的数组 return ;
}

示意图:


c/c++动态分配内存和malloc的使用的更多相关文章

  1. Dynamically allocated memory 动态分配内存【malloc】Memory leaks 内存泄漏

    内存泄露Memory leaks :没有指针指向原来a分配出来的那段空间了

  2. 数据结构复习之C语言malloc()动态分配内存概述

    #include <stdio.h> #include <malloc.h> int main(void) { ] = {, , , , }; // 计算数组元素个数 ]); ...

  3. 数据结构与算法基础之malloc()动态分配内存概述

    动态内存分配和释放: 动态构造一维数组: 假设动态构造一个Int型数组: int *p = (int *)malloc(int len); //还可以写作: int *p = (int *)mallo ...

  4. malloc函数动态分配内存

    #include <stdio.h> #include <stdlib.h> //malloc free #include <windows.h> //sleep ...

  5. 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域

    [源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...

  6. 转: Linux C 动态内存分配 malloc及相关内容 .

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...

  7. 标C编程笔记day06 动态分配内存、函数指针、可变长度參数

    动态分配内存:头文件 stdlib.h     malloc:分配内存     calloc:分配内存,并清零     realloc:调整已分配的内存块大小     演示样例:         in ...

  8. C&C++动态分配内存(手动分配内存)三种方式

    1. malloc函数 函数原型:void *malloc(unsigned int size)函数的作用是:在内训的动态存储区开辟一个size个字节的连续空间,返回所分配区域的首字节地址. 可以看到 ...

  9. c语言中的内存分配malloc、alloca、calloc、malloc、free、realloc、sbr

    C语言跟内存分配方式 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2) 在栈上创建.在执行函数时,函数内局部变 ...

随机推荐

  1. oracle drop table and purge

    一.drop表 执行drop table xx 语句 drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 通过查询回收站 ...

  2. 图解I/O的五种模型

    1.1 五种I/O模型 1)阻塞I/O 2)非阻塞I/O 3)I/O复用 4)事件(信号)驱动I/O 5)异步I/O 1.2 为什么要发起系统调用? 因为进程想要获取磁盘中的数据,而能和磁盘打交道的只 ...

  3. 自己动手实现SharePointList的分页展示

    SharePoin列表里对条目的展示只有上一页下一页,不能够跳转,不能够一次导航到第一页和最后一页. 项目需要,所以对列表的数据展示进行了定制化开发来实现如上的功能. 前端用GridView展示,用L ...

  4. SqlMgmt sql2008报错

    标题: Microsoft SQL Server Management Studio------------------------------ 无法显示请求的对话框. --------------- ...

  5. js局部变量与全局变量

    在最外层定义的是全局变量 如果在函数内部不用var声明直接赋值的变量,那么这个变量也是全局变量 在函数内部用var声明的变量叫做局部变量 定义在最开头的全局变量在整个js范围内都可以访问到,都可以使用 ...

  6. 配置git DiffMerge工具

    git的命令行貌似没有特别好用的UI工具,不管是Android Studio自带的还是其他的,完全代替命令行好像做不到.再加上对git来说没什么比diff和merge更正常不过的事情了.那就配置命令行 ...

  7. .net的 async 和 await

    async 和 await 出现在C# 5.0之后,关系是两兄弟,Task是父辈,Thread是爷爷辈,这就是.net 多线程处理的东西,具体包括 创建线程,线程结果返回,线程中止,线程中的异常处理 ...

  8. MVC小系列(二十二)【MVC的Session超时,导致的跳转问题】

    由于mvc内部跳转机制的问题,它只在当前的action所渲染的view上进行跳转,如果希望在当前页面跳,需要将mvc方法改为js方法: filterContext.Result = new Redir ...

  9. OC 知识点回顾

    /* 字符串: NSString  不可变字符串  字符串对象的内容不能修改,字符串的指针可以改变 NSMutableString 可变字符串   可以修改字符串对象的内容,继承自NSString , ...

  10. Oracle存储过程的理解

    在大专时候学的专业是数据库管理专业,在学校学了各种各样的数据 MSSQL.ORACLE.MySQL. 那时候学数据大部分只学到了些皮毛,仅仅只会按照书上SQL语句,输入计算机得出结果,就很有成就感. ...