【面试题】关于GetMemory的故事

#include <iostream>
using namespace std;

void GetMemory(char *p, int num)
{
	p = (char *)malloc(sizeof(char) * num);
}

void main()
{
	char *str = NULL;
	GetMemory(str,100);
	strcpy(str,"Hello");
}

//编译通过,但运行错误。
//0x61aef689 (msvcr90d.dll) 处未处理的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突


p实际是str的一个副本,编译器总是要给函数的每个参数制作临时副本。p动态申请了内存,只是把p所指向的内存地址改变了,str没有改变。函数GetMemory运行完后,str还是NULL,所以运行报错,内存读取错误。。。

 

#include <iostream>
using namespace std;

void GetMemory(char **p, int num)
{
	*p = (char *)malloc(sizeof(char) * num);
}

void main()
{
	char *str = NULL;
	GetMemory(&str,100);
	strcpy(str,"Hello");
	printf("%s",str);
}
//传入str的地址。指针的地址。这样就可以影响到str了。
//编译通过,运行输出Hello。


#include <iostream>
using namespace std;

char *GetMemory(char *p, int num)
{
	p = (char *)malloc(sizeof(char) * num);
	return p;
}

void main()
{
	char *str = NULL;
	str = GetMemory(str,100);
	strcpy(str,"Hello");
	printf("%s",str);
}
//返回申请的空间给str,这样也可以。
//编译通过,运行输出Hello。

 

#include <iostream>
using namespace std;

char *GetString()
{
	char str[] = "Hello\n";
	return str;
}

void main()
{
	char *str = NULL;
	str = GetString();
	printf("%s",str);
}
//编译通过,运行输出乱码。
//因为GetString中的str数组是局部数组,存在于栈中。
//函数调用完,会栈空间收回。



#include <iostream>
using namespace std;

char *GetString()
{
	char *str = "Hello\n";
	return str;
}

void main()
{
	char *str = NULL;
	str = GetString();
	printf("%s",str);
}
//编译通过,运行输出Hello。
//因为GetString中的str是字符串常量,常量区中。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值