28.C语言内存管理机制
来源:互联网 发布:淘宝微信福利群可信吗 编辑:程序博客网 时间:2024/06/06 03:13
因格式问题,截图上传。
28.stack/* * 公司:XXXX * 作者:Rston * 博客:http://blog.csdn.net/rston * GitHub:https://github.com/rston * 项目:C语言内存管理机制 * 功能:演示栈内存是脏的和爆栈。 */#include <stdio.h>int *func1(void){ int a = 10; printf("in func1 &a = %p.\n", &a); // in func1 &a = 0xbfa45b2c. return &a; // warning: function returns address of local variable [enabled by default]} // 函数试图返回临时变量即栈变量的地址,编译报警void func2(void){ int array[3] = {44, 44, 44}; printf("in func2 &array[2] = %p.\n", &array[2]); // int func2 &array[2] = 0xbfa45b2c.}// 使用递归爆栈void func3(void){ int a = 4; func3();}// 定义数组爆栈void func4(void){ int array[10000000] = {0}; array[10000000 - 1] = 44;}int main(int argc, char **argv){ // 演示栈内存是脏的 int *p = func1(); printf("*p = %d.\n", *p); // *p = 10. func2(); printf("*p = %d.\n", *p); // *p = 44. 说明栈内存是脏的,函数不应该返回栈变量的指针。 // 演示爆栈 printf("即将爆栈\n"); // 即将爆栈 //func3(); // Segmentation fault (core dumped)栈被爆了,程序访问到不该访问的内存空间 func4(); // Segmentation fault (core dumped) return 0;}
28.heap/* * 公司:XXXX * 作者:Rston * 博客:http://blog.csdn.net/rston * GitHub:https://github.com/rston * 项目:C语言内存管理机制 * 功能:演示堆内存使用范例。 */#include <stdio.h>#include <stdlib.h>int main(int argc, char **argv){ // 第1步:申请和绑定内存 int *p = (int *)malloc(100*sizeof(int)); // 第2步:检验申请释放成功 if (NULL == p) { printf("malloc error.\n"); return -1; } // 第3步:使用申请到的内存 *(p+10) = 123; *(p+11) = 456; printf("*(p+10) = %d.\n", *(p+10)); // *(p+10) = 123. printf("*(p+11) = %d.\n", *(p+11)); // *(p+11) = 456. // 第4步:释放申请到的内存 free(p); // free后堆内存还是可被使用,但风险非常大,会造成不可预知的结果 *(p+20) = 123; *(p+30) = 456; printf("*(p+20) = %d.\n", *(p+20)); // *(p+20) = 123. printf("*(p+30) = %d.\n", *(p+30)); // *(p+30) = 456. // malloc(0)的表现,连续调用两次malloc(0),然后将返回的地址相减即可 int *p1 = (int *)malloc(0); if (NULL == p1) { printf("malloc error.\n"); return -1; } if (NULL != p1) { printf("p1 = %p.\n", p1); // p1 = 0x9a85008. } int *p2 = (int *)malloc(0); if (NULL == p2) { printf("malloc error.\n"); return -1; } if (NULL != p2) { printf("p2 = %p.\n", p2); // p2 = 0x9a85018. } printf("(p2-p1)*sizeof(int) = %d.\n", (p2-p1)*sizeof(int)); // (p2-p1)*sizeof(int) = 16. 分配16个字节的堆内存 free(p1); free(p2); // 测试malloc(4)实际的分配效果 int *p3 = (int *)malloc(4); if (NULL == p3) { printf("malloc error.\n"); return -1; } if (NULL != p3) { printf("p3 = %p.\n", p3); // p3 = 0x9a85028. } int *p4 = (int *)malloc(4); if (NULL == p4) { printf("malloc error.\n"); return -1; } if (NULL != p4) { printf("p4 = %p.\n", p4); // p4 = 0x9a85038. } printf("(p4-p3)*sizeof(int) = %d.\n", (p4-p3)*sizeof(int)); // (p4-p3)*sizeof(int) = 16. 分配16个字节的堆内存 free(p3); free(p4); // 测试malloc堆内存的越界访问 int *p5 = (int *)malloc(10*sizeof(int)); if (NULL == p5) { printf("malloc error.\n"); return -1; } *(p5+5) = 123; printf("*(p5+5) = %d.\n", *(p5+5)); // *(p5+5) = 123. *(p5+100000) = 456; printf("*(p5+100000) = %d.\n", *(p5+10000)); // Segmentation fault (core dumped) 访问到了不该访问的内存空间 free(p5); return 0;}
28.data_section/* * 公司:XXXX * 作者:Rston * 博客:http://blog.csdn.net/rston * GitHub:https://github.com/rston * 项目:C语言内存管理机制 * 功能:演示三种机制(栈、堆、数据段)申请内存空间。 */#include <stdio.h>#include <string.h>#include <stdlib.h>// 使用堆机制申请内存空间,定义全局变量char str[] = "linux";int main(int argc, char **argv){ // const的两种实现方式 // 单片机将const修饰的变量放置代码段中实现只读 // gcc通过编译器检查实现只读,变量实际存放在数据段中 const int a = 8; int *p1 = (int *)(&a); // 编译无警告无报错 *p1 = 10; printf("a = %d.\n", *p1); // a = 10. // 使用栈机制申请内存空间,定义局部变量 char b[] = "linux"; // 使用堆机制申请内存空间,手动申请内存和释放内存 char *p = (char *)malloc(10*sizeof(char)); if (NULL == p) { printf("malloc error.\n"); return -1; } memset(p, 0, 10*sizeof(char)); strcpy(p, "linux"); printf("str = %s. b = %s. p = %s.\n", str, b, p); // str = linux. b = linux. p = linux. printf("str = %p. b = %p. p = %p.\n", str, b, p); // str = 0x804a024. b = 0xbff8cc86. p = 0x8ddc008. free(p); return 0;}
0 0
- 28.C语言内存管理机制
- Objective-c内存管理机制
- objective-c内存管理机制
- C/C++内存管理机制
- Objective-C内存管理机制
- objective - c 内存管理机制
- objective-C内存管理机制
- object c内存管理机制
- Objective-C内存管理机制
- C/C++内存管理机制
- objective - c 内存管理机制
- Objective-C 内存管理机制
- C++/Qt 内存管理机制
- C/C++内存管理机制
- C/C++内存管理机制
- Objective-C 内存管理机制
- C/C++内存管理机制
- C语言内存管理机制的一点小问题
- VC远程调试
- java缓存的实现
- 大数据实时处理:百分点实时计算架构和算法
- WorkStationSdk的创建和使用
- Runtime初涉之消息转发 http://www.cocoachina.com/ios/20151015/13769.html
- 28.C语言内存管理机制
- android开发游记:SpringView 下拉刷新的高效解决方案,定制你自己风格的拖拽页面
- mysql 触发器的使用
- android 监听软键盘弹出和隐藏和4.4系统沉浸式通知栏冲突解决
- 码农小汪-剑指Offer之11 - 调整数组顺序使奇数位于偶数前面
- pl/sql中return和exit区别
- AFNetworking超时时间设置
- leetcode之Contains Duplicate
- Android平台移植FFMPEG媒体解码库