动态内存开辟经典笔试题

题目一:

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

仔细观察,GetMemory函数对于str来说进行的是传值调用,并不能改变str的值 。

因此str在函数结束之后仍然是NULL 那么再用str对其引用 就会出现错误。

同时忽略了释放内存,会造成内存泄漏

修改:

void GetMemory(char** p)
{
	*p = (char*)malloc(100);
}
void Test(void)
{
	char* str = NULL;
	GetMemory(&str);//函数并没有改变str的值 传值操作
	strcpy(str, "hello world");//这里对NULL进行引用
	printf(str);
	//释放
	free(str);
	str = NULL;
}

题目二:

经典问题:返回栈空间地址

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

创建的char类型的p[]数组是创建在栈上的局部变量,那么返回他的地址之后,局部变量就销毁了。

再引用销毁局部变量的地址 就会造成非法访问。

也没有进行内存空间的释放,造成内存泄漏。

题目三:

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

这一个修改了题目一中的传值操作的问题 ,采用了二级指针,一次返回值这里没有问题。

但是仍然忽略了内存空间的释放,造成内存泄漏

题目四:

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

该题目首先没有对str进行判断,如果动态内存开辟不成功,就会出现解引用NULL的问题

再有就是除了在对动态内存空间释放后,应当及时将指针置空,否则会出现非法访问

修改:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值