动态内存开辟的经典笔试题

第一题:

void GetMemory(char* p) {
	p = (char*)malloc(100);//内存泄露
}
void Test(void) {
	char* str = NULL;
	GetMemory(str);//传值调用,出了这个函数,开辟的空间被销毁,str仍然是NULL
	strcpy(str, "hello world");//无法打印,因为str是NULL,对空指针解引用,程序会崩溃
	printf(str);
}

第二题:

char* GetMemory(void) {
	char p[] = "hello world";
	return p;//返回p数组的首元素地址
}
void Test(void) {
	char* str = NULL;
	str = GetMemory();//str接受p数组的首元素的地址,但是,出来这个函数p数组被销毁,所以str现在是野指针
	//返回栈空间地址问题
	printf(str);
}

第三题: 

void GetMemory(char** p, int num) {
	*p = (char*)malloc(num);//对二级指针解引用,拿到str的地址,开辟100个空间
}
void Test(void) {
	char* str = NULL;
	GetMemory(&str, 100);//传址调用
	strcpy(str, "hello");
	printf(str);//空间开辟成功,能打印出hello
	//error,没有对开辟的空间释放
	//free(str)
	//str=NULL
}

第四题:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指挥部在下面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值