动态释放内存经典面试题

第一题
void GetMemory(char* p){ 

	char* p = malloc(40);
}

void Test(void) {

	char* str = NULL;
	GetMemory(str);
	strcpy(str, "hello world"); //程序奔溃
	printf(str);
}
int main() {

	Test();
	return 0;
}

代码执行后奔溃。
这个代码有两处错误

  1. str 指针想申请内存空间,可是将str传入GetMemory函数后,因为传的不是str的地址,p是str的一份临时拷贝,str将值NULL传给了p,所以最终p申请的空间是p指向的,执完后也没有释放申请的空间,且无法找到,会造成内存泄漏。
  2. 所以str仍然存放的是NULL,后面通过strcpy函数对str指向的空间存放字符时,时非法访问内存了。

改正1

void GetMemory(char** p){ 

	*p = malloc(40);
	
}

void Test(void) {

	char* str = NULL;
	GetMemory(&str);
	strcpy(str, "hello world")
	printf(str);

	free(str);
	str = NULL;
}
int main() {

	Test();
	getchar();
	return 0;
}

改正2

char* GetMemory(char* p){ 

	p = malloc(40);
	return p;
}

void Test(void) {

	char* str = NULL;
	str = GetMemory(str);
	strcpy(str, "hello world");
	printf(str);

	free(str);
	str = NULL;
}
int main() {

	Test();
	getchar();
	return 0;
}
第二题
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

char* GetMemory(void){ 

	char p[] = "hello world"; //栈空间
	return p;
}

void Test(void) {

	char* str = NULL;
	str = GetMemory();
	printf(str);
}
int main() {

	Test();
	getchar();
	return 0;
}

错误:p时局部变量,执行完GetMemory函数后,返回了p的地址,可是p执行的空间是栈区,执行完函数后,会被回收,所以将p的地址返回str,打印出随机值。

char* GetMemory(void){ 

	static char p[] = "hello world";//静态工作区
	return p;
}

void Test(void) {

	char* str = NULL;
	str = GetMemory();
	printf(str);
}
int main() {

	Test();
	getchar();
	return 0;
}

正确:p所指向的空间通过static修饰,成为了静态工作区的数据,生命周期变长

char* GetMemory(void){ 

	char* p = malloc(40);//堆空间
	return p;
}

void Test(void) {

	char* str = NULL;
	str = GetMemory();
}
int main() {

	Test();
	getchar();
	return 0;
}

正确:p所指向malloc申请的堆空间,手动释放后,或者程序运行结束才会将这块空间还给操作系统

第三题
char* GetMemory(char **p,int num){ 

	* p = (char *)malloc(num);
}

void Test(void) {

	char* str = NULL;
	GetMemory(&str,100);
	strcpy(str, "hello");
	printf(str);
}
int main() {

	Test();
	getchar();
	return 0;
}

执行代码,打印出hello,错误就是没有忘记释放动态开辟的内存,导致内存泄露了。

第四题
void Test(void) {

	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);
	//str = NULL; 修改后
	if (str != NULL) {
		strcpy(str, "world");
		printf(str);
	}
	printf(str);
}
int main() {

	Test();
	getchar();
	return 0;
}

这个题考察的是,free了str后,不会把str置为NULL。所以free后,将str 置为NULL就行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值