关于面试题中出现的内存传递问题

本文通过两个示例详细解析了如何在不同函数间正确地传递内存,包括使用二级指针和返回指针两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人最近做了几道面试题,都是关于内存传递的,这一块内容经常出现在面试题中,所以做了一些总结,其中不足之处,还望各位大神多多指教

先来看一段程序:

<span style="white-space:pre">	</span>void GetMemory(char *p)
	{
		p=(char *)malloc(100);
	}
	void Test(void)
	{
		char *str=NULL;
		GetMemory(str);
		strcpy(str,"hello world");
		printf(str);
	}

问:这个程序会出现什么问题?

答案:GetMemory()中申请的空间并没有传到Test()函数中,str没有空间,无法使“hello world”复制到str中,出现段错误。

那么如何使内存传递到Test的str中呢?什么原理呢?

有两种方法可以达到上述目的.

第一种方法:

<span style="white-space:pre">	</span>void GetMemory(<u>char **p</u>)
	{
		<u>*p=(char *)malloc(100);</u>
	}
	void Test(void)
	{
		char *str=NULL;
		<u>GetMemory(&str);</u>
		strcpy(str,"hello world");
		printf(str);
	}

我们是使用二维指针来完成内存的传递,char **p是二级指针,p中存放的是str的地址,*p=str;*p=(char *)malloc(100),直接针对str的地址进行申请内存,这样就在GetMemory中,成功对str申请了内存。其中,本人认为*p就是str的另外一种表达方式而已,完全与str等同,地址和内容完全相同,假设*p不是完全等同,那么*p进行malloc后,指向也有了改变,str指向并没有变,那么*p有空间后,str不应该也得到了内存,与最后执行结果不符,所以本人认为i,*p只是str的另一种表达方式。


第二种方法:

<span style="white-space:pre">	</span>char* GetMemory(char *p)
	{
		p=(char *)malloc(100);
<span style="white-space:pre">		</span>return p;
	}
	void Test(void)
	{
		char *str=NULL;
		str=GetMemory(str);
		strcpy(str,"hello world");
		printf(str);
	}
这种解决内存传递的方法十分直接,直接将内存返回给str。下面我来解释一下这个原理:char *p这个指针代表的是p的指向和str指向一致,在GetMemory中,p得到了一块内存地址,然后经过return p,把p中存放的内存地址赋给str,str指向一块p赋给的内存地址,于是就有了内存。这种方法用比较直观的方式完成了内存的传递。

一点小心得,如果有不足之处,欢迎大神批评指出!共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值