zoukankan      html  css  js  c++  java
  • 内存分配小问题

            前阵子抱着打酱油的心态去面试了一下学校里某个俱乐部举行的一次执委面试,没想到被几个小问题给卡住了。面试完后下了一天苦工终于把那些问题搞定了,呵呵,看来没事多去面试一下还是有好处的,起码知道自己哪些地方存在不足。这里就说说其中一道关于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     else
    20     {
    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     else
    19     {
    20         printf("alloc mem failed\n");
    21     }
    22         
    23     return 0;
    24 }

    运行的结果是:

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

  • 相关阅读:
    Mysql update case
    phpexcel导出excel等比例缩放图片
    phpexcel错误 You tried to set a sheet active by the out of bounds index: 1解决办法
    phpexcel操作
    Java io基础
    java线程基础
    java 集合基础(适用单线程)
    java 泛型深入
    Java反射基础
    Java泛型基础
  • 原文地址:https://www.cnblogs.com/lknlfy/p/2522202.html
Copyright © 2011-2022 走看看