动态内存管理的四个经典面试题

例题1:

void GetMemory(char *p)
{
 p = (char *)malloc(100);
}
void Test(void)
{
 char *str = NULL;
 GetMemory(str);
 strcpy(str, "hello world");
 printf(str);
}

答:无法正常运行
因为GetMemory接收的是str,p是形参只是实参str的一份临时拷贝,所以给形参p开辟空间对于实参str没有影响,但由于 malloc开辟的空间没有被free释放,所以开辟空间成功,但是开辟的空间不属于str,p作为形参在函数结束以后也被释放。

例题2:

char *GetMemory(void)
{
 char p[] = "hello world";
 return p;
}
void Test(void)
{
 char *str = NULL;
 str = GetMemory();
 printf(str);
}

答:无法正常运行
因为在函数GetMemory中,函数返回的时候,函数中的数组其实会释放,空间还给了操作系统,所以返回的地址其实是没有意义的。虽然str接收了p,但是p所指向的数组里的内容已经被释放。

例题3:

void GetMemory(char **p, int num)
{
 *p = (char *)malloc(num);
}
void Test(void)
{
 char *str = NULL;
 GetMemory(&str, 100);
 strcpy(str, "hello");
 printf(str);
}

答:可以正常运行,但是存在内存泄漏
GetMemory函数接收函数指针可直接对str进行修改,但是因为malloc开辟了动态空间,必须要free释放所开辟的空间,题目中没有free(str)所以会存在内存泄露。

例题4:

void Test(void)
{
 char *str = (char *) malloc(100);
 strcpy(str, "hello");
 free(str);
 if(str != NULL)
 {
 strcpy(str, "world");
 printf(str);
 }
}

答:无法正常运行
在第一次strcpy后,str指向的内存里存入了hello,但是接着就free(str)释放了str,即将str指向的空间还给了操作系统,时str依然指向刚刚的位置,并且hello还存在,进入if循环语句。但是此时指向的空间已经不属于str,此时的str是一个野指针,所以world无法拷贝到str指向的空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值