C语言动态分配内存知识
2015-07-12 10:23
141 查看
数组的长度必须事先指定,只能是常整数,不能是变量
传统形式定义的数组,该数组的内存程序员无法手动释放,只能在定义>该数组的函数使用完毕后,释放数组占用的内存。
数组的长度一旦定义,其长度就不能更改。
传统形式定义的数组不能跨函数使用。
动态内存分配可以很好的解决传统数组的缺点。
传统数组也被称之为静态数组。
malloc函数介绍:
malloc是memory(内存)allocate(分
虽然malloc函数返回的第一个字节的地址,无法表明p指向的内存单元>的具体位置,
但是用int *进行类型强制转换可以,表明等号右端是一个整型变量的地>址,而不是第一个字节的地址。
等号左端的指针变量也就指向了整个的这4个字节合起来的一大块内存
内存单元。
举例说明:
malloc(200);//向系统申请分配200个字节的变量存储单元。
如果malloc(200)前面用的是char *强制类型转换,即
(char *)malloc(200);则表示200个字符的变量
(int *)malloc(200);//表示50个整型的变量
(double *)malloc(200)//表示25个双精度型变量
另外对于动态分配的的指针数组,比如整型的指针数组,
每移动一次,移动的不是一个字节,而是4个字节
这是因为整型的指针变量数组中的指针变量指向的
第一个内存单元(int类型本身占4个字节)占4个字节,
等到这个指针变量移动一位,相当于数组下标加1,
其实就指向了第二块占4个字节(整型数据对应的内存单元)的内存单元
比如:
int len = 5;
int * p;
p = (int *) malloc(len *sizeof(int));
此处的p实际上指向了在内存空间中占20个字节的内存单元的前4个
字节,如下图所示
传统形式定义的数组,该数组的内存程序员无法手动释放,只能在定义>该数组的函数使用完毕后,释放数组占用的内存。
数组的长度一旦定义,其长度就不能更改。
传统形式定义的数组不能跨函数使用。
动态内存分配可以很好的解决传统数组的缺点。
传统数组也被称之为静态数组。
malloc函数介绍:
malloc是memory(内存)allocate(分
#include <stdio.h> #include <malloc.h> int main(void) { int i = 5;//分配了4个字节,静态分配 /* 1、要使用malloc这个函数,必须添加malloc.h这个头文件 2、malloc函数只有一个形参,并且形参是整型。 3、4表示请求系统为本程序分配4个字节 4、malloc只能返回第一个字节的地址,虽然系统为它分配了4个字节 5、p所指向的内存空间占4个字节, 所以14行的执行使用了内存中8个字节 6、p本身所占的内存是静态分配的,p所指向的内存是动态分配的。 */ int * p = (int *)malloc(4); /* p代表一个int变量, 是不同于int i = 5;中, i静态分配的内存空间。 */ *p = 5; /* free(p)表示把p所指向的内存空间给释放掉, 而p本身所占的内存空间是静态分配的, 才会释放p本身所占的内间 */ free(p); return 0; }
虽然malloc函数返回的第一个字节的地址,无法表明p指向的内存单元>的具体位置,
但是用int *进行类型强制转换可以,表明等号右端是一个整型变量的地>址,而不是第一个字节的地址。
等号左端的指针变量也就指向了整个的这4个字节合起来的一大块内存
内存单元。
举例说明:
malloc(200);//向系统申请分配200个字节的变量存储单元。
如果malloc(200)前面用的是char *强制类型转换,即
(char *)malloc(200);则表示200个字符的变量
(int *)malloc(200);//表示50个整型的变量
(double *)malloc(200)//表示25个双精度型变量
另外对于动态分配的的指针数组,比如整型的指针数组,
每移动一次,移动的不是一个字节,而是4个字节
这是因为整型的指针变量数组中的指针变量指向的
第一个内存单元(int类型本身占4个字节)占4个字节,
等到这个指针变量移动一位,相当于数组下标加1,
其实就指向了第二块占4个字节(整型数据对应的内存单元)的内存单元
比如:
int len = 5;
int * p;
p = (int *) malloc(len *sizeof(int));
此处的p实际上指向了在内存空间中占20个字节的内存单元的前4个
字节,如下图所示
相关文章推荐
- WinSock2简单的服务器与客户端(C语言实现)
- [C++]VS与第三方工具下载
- [C++]VAssistX函数添加注释功能设置
- [C++]Microsoft Visual Studio (VS)2010 功能设置
- [C++]VisualAssistX中文注释提示错误 解决办法
- [C++]Microsoft Visual Studio (VS)2010 常用快捷键大全
- DES加密的C语言实现
- C++箴言:理解 typename 的两个含义
- Android NDK C++ 开发利器:Android Studio
- C++设计模式--观察员
- c语言,链表
- hdu 1231, dp ,maximum consecutive sum of integers, find the boundaries, possibly all negative, C++
- sizeof,终极无惑『转』
- KeyPoint类型者转化为c++普通类型
- OpenGL蓝宝书第五章代码勘误以及惯性坐标系去解释模型变换:Pyramid.cpp
- Lowest Common Ancestor of a Binary Search Tree
- [C++]GCC的C++入门(2012-10-28更新)
- 【C++基础】——拷贝构造函数的浅拷贝和深拷贝
- 个人c语言感悟
- stl非变易算法(一)