程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 內存分配小問題

內存分配小問題

編輯:關於C

前陣子抱著打醬油的心態去面試了一下學校裡某個俱樂部舉行的一次執委面試,沒想到被幾個小問題給卡住了。面試完後下了一天苦工終於把那些問題搞定了,呵呵,看來沒事多去面試一下還是有好處的,起碼知道自己哪些地方存在不足。這裡就說說其中一道關於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()分配的內存是在堆上,函數調用結束後不會被系統回收,需要由程序員去釋放。

 


摘自 lknlfy
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved