/**
* 以下操作都以声明数组为例 !
*
* 一 使用形式的区别
* malloc的使用:
* int *a = (int *)malloc(sizeof(int)*N);
* 直接声明:
* int a[N];
*
*二 分配方式的区别
* malloc动态分配----内存是在堆区分配的,分配内存时需要在堆区分配,耗时较大,因为内存管理操作的缘故,分配的内存需要手动析构;
* int a[N] 静态分配 ----存储区是在栈里分配的,耗时相对小,因为该操作只需要移动栈指针就行,分配的内存自动析构。
*
* 三 释放
* malloc使用完不调用free会引起内存泄漏
* int a[N]--静态分配--栈上分配的内存系统自动释放
*
* 四 作用范围---------------见示例代码
* malloc 全局
* int a[N] 局部
*
* 五 总结
* 如果变量有局部性、知道其大小、且存储区无须变动时,使用静态分配,否则动态分配
*
*/
#include "stdio.h"
#include "malloc.h"
#define N 5
//malloc申请内存
int *function1(){
int *a=(int *)malloc(sizeof(int)*N);
for(int i=0;i<N;i++){
a[i]=i+1;
}
return a;
}
//直接声明
int *function2() {
int a[N];
for(int i=0;i<N;i++){
a[i]=i+1;
}
return a;
}
int main(){
//获取函数中申请的数组地址--malloc方法
int *a=function1();
//打印结果
for(int i=0;i<N;i++){
printf("%4d",a[i]);// 1,2,3,4,5
}
free(a); //注意释放!!!
printf("\n");
//获取函数中申请的数组地址--直接声明
int *b=function2() ;
//打印结果
for(int i=0;i<N;i++){
printf("%4d",b[i]);//1 2635694020085987201439844825
//内存已经被释放
}
printf("\n");
}
//解决了我的困惑:
/**
* 为什么声明在结构体中的数组,通过malloc创建结构体时,作用范围会比直接声明的数组大。
*/
malloc与直接声明变量的区别
最新推荐文章于 2023-03-18 13:51:06 发布