C语言之内存管理

动态内存分配

传统数组的缺点

1.数组长度必须事先指定,而且只能是常整数,不能是变量。

代码示例

例子int a[5]; 	//必须事先指定,而且只能是常整数int len = 5; int a[len];//error

2.传统形式定义的数组,该数组的内存程序员无法手动释放数组一旦定义,系统为数组分配的内存空间就会一直存在,除非数组所在的函数运行终止,数组的空间才会被系统自动释放(不是清零)。。

void f(void)
{
    //数组a 占20个字节的内存空间,无法手动编程释放它,数组a只能在f()函数结束被系统释放 
	int a[5]={1,2,3,4,5};
} 

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

数组的长度不能在函数运行的过程中动态的扩充或缩小。

4、传统方式定义的数组不能跨函数使用 。

A函数定义的数组,只有在A函数运行期间才可以被其他函数使用。
但A函数运行完毕后,A函数中的数组将无法在被其他函数使用。

代码示例

# include <stdio.h>
void gmin(int * pArr, int len)
{
	pArr[2] = 88;  //pArr[2] == a[2]
}

void fmax(void)
{	
    /*
		20个字节的存储空间程序员无法手动编程释放它,它只能在本函数运行完毕时由系统自动释放
    */
	int a[5] = {1,2,3,4,5};  
	gmin(a, 5);			
	printf("%d\n", a[2]);
}

int main(void)
{	
	fmax();
	return 0;
}

动态内存分配

很好的解决的了传统数组的4个缺陷 ( malloc的使用 )

代码示例

# include <stdio.h>
# include <malloc.h>
#include <string.h>

void test()
{
    int * p = NULL;
    p = (int *)malloc(sizeof(int)); 

    if(p == NULL){
        perror("malloc");
        return ;
    }
    //清空空间
	memset(p, 0, sizeof(int));

    *p = 10;
    printf("*p=%d\n", *p);

    free(p); // 释放
}

int main()
{
    // 调用函数
    test();
    return 0;
}

malloc实现图解

图示:

代码示例

# include <stdio.h>
# include <malloc.h>

void fmin(int * q)
{
	//*p = 200; //error
	//q = 200; 	//200不是整型变量的地址,q只能存放整型变量的地址
	//**q = 200;  //error
	*q = 200;
	//free(q);  //把q所指向的内存释放掉  本语句必须的注释掉,否则会导致第20行的代码出错
}

int main(void)
{
	int * p = (int *)malloc(sizeof(int)); //sizeof(int)返回值是int所占的字节数
	*p = 10;

	printf("%d\n", *p);  //10
	fmin(p);  //p是int *类型
	printf("%d\n", *p);  //200    第20行

	return 0;
}

图解

动态一维数组示例

代码示例

# include <stdio.h>
# include <malloc.h>

int main(void)
{	//如果int占4个字节的话,则本数组总共包含有20个字节,每四个字节被当做了一个int变量来使用
	int a[5]; 
	int len;
	int * pArr;
	int i;

	//动态的构造一维数组
	printf("请输入你要存放的元素的个数: ");
	scanf("%d", &len);
    
    /*
	本行动态的构造了一个一维数组, 该一维数组的产度是len, 该数组的数组名是pArr.
	该数组的每个元素是int类型  类似于 int pArr[len];
    */
	pArr = (int *)malloc(4 * len);  
	
	//对一维数组进行操作,  如:对动态一维数组进行赋值
	for (i=0; i<len; ++i)
		scanf("%d", &pArr[i]);

	//对位一维数组进行输出
	printf("一维数组的内容是:\n");
	for (i=0; i<len; ++i){
		printf("%d\n", pArr[i]);
    }
		
	free(pArr); //释放掉动态分配的数组
	
	return 0;

图解动态一维数组

动态数组的优点

1.动态数组长度不需要事先给定;

2.内存空间可以手动释放。

3.在程序运行中,动态内存空间大小可以通过realloc函数手动扩充或缩小

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

- 静态内存是由系统自动分配,有系统自动释放
- 静态内存是在栈分配的		
		
- 动态内存是由程序员手动分配、手动释放
- 动态内存是在堆分配的

猜你喜欢

转载自www.cnblogs.com/Guard9/p/12905136.html