
需要导入头文件#include
// 1. 申请一个链表中的节点
ListNode* tmpNode = (ListNode*)malloc(sizeof(Node));
// 2. 申请一个数组
int* array_int = (int*)malloc(sizeof(int)*10);
char* arrar_char = (char*)malloc(sizeof(char)*10);
2. 使用malloc申请的数组和普通数组的区别
- 使用malloc申请的数组,内存分配在堆中,程序员不free,就存在,直到程序结束,由系统回收。如果不和free配对使用,有可能造成内存泄露。
- 普通数组-局部变量,内存分配在栈中,局部函数结束,就被回收。
| 区域 | 作用 | 生命周期 |
|---|---|---|
| 栈区 | 存放局部变量名 | 栈区(stack)–由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。 |
| 堆区 | 存放new或者malloc出来的对象 | 堆区(heap)–般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。 |
| 静态区 | 用于存放全局变量或者静态变量 | 全局区(静态区)(static)–全局变量和静态变量的存储是放在一块的。程序结束后由系统释放。 |
下面俩个程序均是对传入的整数的每一位数字进行统计和函数,唯一的不同在于int版本test函数中使用普通数组返回,而malloc版本中返回的是malloc出来的数组。
思考一下有什么不同,然后我们来看实验结果。
- 普通数组版本:
#includeusing namespace std; int* test(int x){ int cnt[10]; for(int i=0;i<10;i++) cnt[i] = 0; do{ int k = x%10; cnt[k]++; x = x/10; }while(x!=0); return cnt; } int main() { int a = 123; int b = 456; int* cnt_a = test(a); int* cnt_b = test(b); for(int i=0;i<10;i++){ cout<<cnt_a[i]<<" "; } cout<<endl; for(int i=0;i<10;i++){ cout<<cnt_b[i]<<" "; } cout<<endl; return 0; } - malloc版本:
#includeusing namespace std; int* test(int x){ int *cnt = (int*)malloc(sizeof(int)*10); for(int i=0;i<10;i++) cnt[i] = 0; do{ int k = x%10; cnt[k]++; x = x/10; }while(x!=0); return cnt; } int main() { int a = 123; int b = 456; int* cnt_a = test(a); int* cnt_b = test(b); for(int i=0;i<10;i++){ cout<<cnt_a[i]<<" "; } cout<<endl; for(int i=0;i<10;i++){ cout<<cnt_b[i]<<" "; } cout<<endl; return 0; }
-
普通数组版本
-
malloc版本
普通申请的数组,在函数结束之后就被系统回收,不能用于返回。
但是malloc申请的数组,只要没有调用free函数进行回收,一直会存在,可以用于返回。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)