C语言 -- 动态内存开辟经典题目

本文通过四个经典笔试题探讨了C/C++中动态内存管理的常见误区及陷阱,涉及内存分配、释放、局部变量作用域等问题。

动态内存开辟经典题目

经典笔试题

题目1

void GetMemory(char* p)
{
    p = (char*)malloc(100);
    //在函数结束之后,p会被释放
}
void Test(void)
{
    char* str = NULL;
    GetMemory(str); //无法完成动态开辟
    strcpy(str, "hello world");
    printf(str);
} 
void main()
{
    Test();
}

上述代码就是很经典的函数参数的寿命问题,参数p在函数GetMemory结束之后,p会被释放,这一点可以通过对程序的逐步调式发现。

题目2

char* GetMemory(void)
{
	//若修改为static char p[] = "hello world";
	//则结果正确
    char p[] = "hello world";
    return p;
}
void Test(void)
{
    char* str = NULL;
    str = GetMemory();
    printf(str);
}
void main()
{
    Test();
}

上述代码的问题就在于,p也是一个局部变量,虽然return了p,却也只是将p的地址传给了str,但是该地址里存放的内容在GetMemory函数结束之后也会被释放,所以str并不会接收到“hello world”

题目3

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

上述代码没有大问题,若是严格的话,就是没有释放。

题目4

void Test(void)
{
	char* str = (char*)malloc(100);
	if (str != NULL)
	{
		strcpy(str, "hello");
		printf(str);
		free(str); //释放空间
		//str = NULL; //释放指针
		if (str != NULL)
		{
			strcpy(str, "world");
			printf(str);
		}
	}
}
void main()
{
	Test();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值