内存四区笔记
2016-06-15 00:51
330 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> void print_arr(int *buf, int n) { int i; for (i = 0; i < n; ++i) { printf("%d\n", buf[i]); } } int main() { int array[100] = {0}; //栈中数组 // void *malloc (size_t __size) char *p1 = malloc(sizeof(char) * 1000); free(p1); int *p = malloc(sizeof(int) * 100); //在堆中申请内存,大小为100个int,当数组用 memset(p, 0, sizeof(int) * 100); //初始化 int i; for (i = 0; i < 100; ++i) { p[i] = i; } print_arr(p, 100); free(p); }
#include <stdio.h> #include <stdlib.h> //既要申请内存,又要有变量指向该内存,这样此时有效的,缺一不可。 //内存释放与否 VS 作用域规则 是两码事 //只不过栈中变量随作用域具有一致性,出了作用域,栈内存也释放了 //而堆中变量出了作用域,变量失效,但堆内存若没有手动释放,则依然存在 //严重错误 void getheap(int *p) { p = malloc(sizeof(int)); //getheap执行完后,p就消失了,导致指向具体堆空间的地址编号也随之消失了 } //改正,利用二级指针 void getheap1(int **p){ *p = malloc(sizeof(int)); } int main7() { int *p = NULL; getheap(p);//值传递,实参没有任何变化 getheap1(&p);//正确 free(p); } //错误,不能将一个栈变量的地址通过函数的返回值返回,函数运行结束(出了作用域),栈地址就自动释放了,相当于野指针 int *geta() { auto int a = 10; return &a; } //正确,可以通过函数的返回值返回一个堆地址,但记得,一定要free int *geta1() { int *p = malloc(sizeof(int)); return p; } //正确,a在静态区,不用free int *geta2() { static int a = 0; return &a; } int main6() { int *getp = geta1(); *getp = 100; free(getp); }
相关文章推荐
- px4开发指南——linux下qgroundcontrol地面站安装
- 内存四区笔记
- CSDN code 心得
- 第三次C语言课程设计作业
- C语言小项目--贪吃蛇游戏
- 网络篇——android中的Http(一)之Http协议基础
- 《数值分析》总结
- Linux字符串函数集
- win2008 R2中安装MySQL出现ODBC连接器安装错误
- Linux access
- Linux(Ubuntu)下面SecureCRT 完全破解
- ajax 的 async属性
- Android App 性能优化之图片优化
- pycharm快捷键
- C-链表
- akira之修改linux 3.6.8内核并添加系统调用
- 串口数据异常,数据段获取到两段或者三段
- win7与virtualbox安装的ubuntu系统资源相互访问
- leetcode_c++:Majority Element(169)
- Android Material Design (底部导航栏)