C语言笔试题(1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,“hello world”);
}
int main(void)
{
char *str=NULL;
getmemory(str);
printf(“%s/n”,str);
free(str);
return 0;
}
上述程序执行后会出现什么问题?
答:
问题所在:(我的理解)原题中str是个空指针,getmemory函数把str的NULL这个值赋给了形参p,p是一个区别于str的另一个字符指针,函数中执行malloc函数在堆中动态分配了100字节内存,malloc函数最后return了100字节的首地址,并将这首地址强制转换为char 类型赋值给了形参p,strcpy函数将字符串常量“hello world”复制给了p所指向的字符串(区别于p=“hello world”,如果用这个替代strcpy这行代码则原理是“hello world”的首地址赋值给了p)。str的值依然没有改变,p和str是两个变量,互不干扰,唯一相关的就是str的值复制给了p。所以若printf(“%s/n”,str),str仍是NULL,所以打印str为空。对于free(str),free一个空指针对内存来说没有任何影响,这是允许的,也没任何害。但是,在getmemory函数里动态分配的内存未释放掉,将会导致内存泄漏,又没办法把这段内存找回来,虽然形参p里存储这段内存的首地址,但他是形参,是函数里定义的变量,存放于栈中,在函数执行完就被释放掉了,所以没有人知道动态分配的这段内存在哪儿,唯一与这段内存有关系的p不存在了。
解决办法:根本原因是形参p和str为两个不同变量,只需将str的地址赋值给形参p,这样p就是真正的str本体,后续的操作也就有效,不会存在内存泄漏,动态分配的内存也正常被释放掉。