三. 动态内存的分配和释放

196 阅读1分钟

例子:

    //malloc:  memory(内存)  allocate(分配)的缩写 
 
    #include <stdio.h>
    #include <stdlib.h>                   //或者写成 #include <malloc.h> 

    int main()
    {

	int * p1 = (int *)malloc(12);   //要使用先加头文件#include <stdlib.h>
                                   //或者写成 #include <malloc.h> 
	/*
         1. 动态构造了12个字节个内存地址,但是malloc函数只返回第一个字节的地址
         2. 为了表示此块地址的数据类型,因此使用了强制类型转换
         3. 此例转换成了int 类型的,占4个字节
         4. 所以int指针变量p1保存了前4个字节(第一个元素)的第一个的地址
         5. p1 = &p1[0], p1指向p1[0] 
	*/
					
        //与静态数组对比 :int p2[3];
	/*		
         1. 数组是静态的 
         2. 数组是int 类型的,占4个字节,共12个字节
         3. p2是数组名,保存的是第一个元素的第一个地址,而第一个元素占四个字节
         4. 即p2 = &p2[0], p2指向p2[0]	    
	*/
	
	free(p1); //使用free函数进行释放
	
	return 0;
}	 

结论

相同点:

可以看出使用malloc函数动态分配的数组和静态分配的他们效果是相同的 

不同点:

动态分配的内存在某个函数内执行完毕不会释放,因此动态内存可以跨函数使用 
动态分配的内存需要手动释放【重要】,不释放可能造成占用内存的问题 
静态分配的内存在某个函数内执行完毕系统自动释放,因此静态内存不可以跨函数使用