博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存分配小问题
阅读量:6605 次
发布时间:2019-06-24

本文共 1076 字,大约阅读时间需要 3 分钟。

        前阵子抱着打酱油的心态去面试了一下学校里某个俱乐部举行的一次执委面试,没想到被几个小问题给卡住了。面试完后下了一天苦工终于把那些问题搞定了,呵呵,看来没事多去面试一下还是有好处的,起码知道自己哪些地方存在不足。这里就说说其中一道关于C语言内存分配的问题。

     看下面这个程序:

1 void allocmem(char **p) 2 { 3     char r[10]={
1}; 4 *p = r; 5 } 6 7 8 int main() 9 {10 int i;11 char *m = NULL;12 13 allocmem(&m);14 if(m)15 {16 for(i = 0; i<10 ; i++)17 printf("m[%d] = %d\n",i,m[i]);18 }19 else20 {21 printf("alloc mem failed\n");22 }23 24 return 0;25 }

运行的结果是:

再看下面这个程序:

1 void allocmem(char **p) 2 { 3     *p = malloc(10); 4     memset(*p,1,10); 5 } 6  7 int main() 8 { 9     int i;10     char *m = NULL;11 12     allocmem(&m);13     if(m)14     {15         for(i = 0; i<10 ; i++)16             printf("m[%d] = %d\n",i,m[i]);17     }18     else19     {20         printf("alloc mem failed\n");21     }22         23     return 0;24 }

运行的结果是:

        这两个程序的区别就是在allocmem()函数里分配内存的方式不一样,结果就是用局部变量(数组)分配的内存在函数调用结束后会被系统回收,也就是说这种方式所分配的内存是在栈上;而是用malloc()分配的内存是在堆上,函数调用结束后不会被系统回收,需要由程序员去释放。

 

转载于:https://www.cnblogs.com/lknlfy/archive/2012/05/28/2522202.html

你可能感兴趣的文章
C/C++五大内存分区(转)
查看>>
System V 共享内存区
查看>>
springmvc_1(hello world)
查看>>
0.随笔——读后感
查看>>
Linux基本安全措施、加强系统账号密码安全、系统引导和登录安全、用户切换、su、sudo、grub菜单...
查看>>
StringUtils类方法解析
查看>>
CentOS 6.5下PXE+Kickstart无人值守安装操作系统
查看>>
Nginx ssl/https 配置
查看>>
客户端通过TCP通信分页从服务器获取数据
查看>>
steps of Tie Line Change(Avaya G450)
查看>>
HTTP协议包头分析
查看>>
HNUSTOJ-1600 BCD时钟
查看>>
oracle范围分区表和INTERVAL分区表相互转化
查看>>
防火墙基础:ISA Server 防火墙客户端和Forefront TMG 客户端介绍
查看>>
xtrapivotcontrol 控件用法及相关属性
查看>>
13.MongoDB 连接命令格式
查看>>
关于wireshark
查看>>
[c++] How many bytes do pointers take up?
查看>>
使用Git和Github来管理自己的代码和笔记
查看>>
Shell脚本 常用命令总结 二
查看>>