c面试题test()

本文探讨了四个C语言程序中涉及内存管理的面试题,包括使用void GetMemory()函数、返回栈上数组地址、使用指向指针的指针以及释放内存后再次使用的场景。每个问题都分析了可能导致的运行结果,如程序崩溃、乱码输出、内存泄漏以及可能的堆破坏。解答强调了指针管理、栈与堆的区别以及内存释放后的安全操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一:请问运行Test 函数会有什么样的结果?

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void){

char *str = NULL;

GetMemory(str);

strcpy(str, "hello world");

printf(str);

}

【Jacob】 程序崩溃,str是一个指针,它的值是NULL,GetMemory 中p的初始值为空,P是保存在栈上,然后p的值有效,调用函数结束后p的值

消失。str的值依然是NULL,所以崩溃。假设str的地址是0x...1234,这个地址的值为NULL,函数传递参数是按值传递,p在栈上,

假设地址是0x...4567,地址里面的值是NULL.调用malloc后,地址0x...4567中的值是有效的地址值。函数调用后,0x...1234中的值没有改变还是

NULL;0x...4567的值无效,可能是正确的分配得到的内存的值,也可能是乱码。所以崩溃。应该用指向指针的指针。


第二:请问运行Test 函数会有什么样的结果?

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

}

【jacob】

乱码.p是一个数组,这个数组在栈上。char p[] = "hello world"; 栈上的p的数组有效的值"hello world".

然后函数调用结束,把数组的起始地址传给str,str的地址有效,内容无效,函数调用完栈清空。这个地址就是一个无效的地址

如果有别的栈正好也用了刚才清空的栈所分配的内存。防伪这个地址的内容就不知道是什么东西了。

第三:请问运行Test 函数会有什么样的结果?

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

}

【Jacob】能正确输出"hello",内存泄漏。

第四:请问运行Test 函数会有什么样的结果?

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

}

【Jacob】

有可能产生堆破坏。free完之后应该str = NULL;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值