您的位置:首页 > 编程语言 > C语言/C++

C语言动态分配内存知识

2015-07-12 10:23 141 查看
数组的长度必须事先指定,只能是常整数,不能是变量

传统形式定义的数组,该数组的内存程序员无法手动释放,只能在定义>该数组的函数使用完毕后,释放数组占用的内存。

数组的长度一旦定义,其长度就不能更改。

传统形式定义的数组不能跨函数使用。

动态内存分配可以很好的解决传统数组的缺点。

传统数组也被称之为静态数组。

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个

字节,如下图所示

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: