前阵子抱着打酱油的心态去面试了一下学校里某个俱乐部举行的一次执委面试,没想到被几个小问题给卡住了。面试完后下了一天苦工终于把那些问题搞定了,呵呵,看来没事多去面试一下还是有好处的,起码知道自己哪些地方存在不足。这里就说说其中一道关于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()分配的内存是在堆上,函数调用结束后不会被系统回收,需要由程序员去释放。