前陣子抱著打醬油的心態去面試了一下學校裡某個俱樂部舉行的一次執委面試,沒想到被幾個小問題給卡住了。面試完後下了一天苦工終於把那些問題搞定了,呵呵,看來沒事多去面試一下還是有好處的,起碼知道自己哪些地方存在不足。這裡就說說其中一道關於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