传递动态内存

本文通过一个简单的C++示例程序,深入剖析了在函数调用中传递指针时所遇到的内存分配问题。主要解释了为何在函数内部为参数分配的内存无法作用于原始指针变量,并附带说明了参数传递机制及其对内存分配的影响。

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

http://hi.baidu.com/microgrape/blog/item/ac7c0bcaf57b27f753664f37.html

 

1.void GetMemory( char *str, int size )
2.{
3.     printf(
"address of str = %x/n",&
str );
4.     str
= new char[size+1
];
5.     printf(
"address of str = %x/n",&
str );
6.}

7.int
main()
8.{
9.    
char *p = "hello"
;
10.   printf(
"address of p = %x/n", &
p );
11.   GetMemory( p,
6
);
12.   printf(
"address of p = %x/n", &
p );
13.  
//strcpy( p, "hello" );

14.   return 0 ;
15.}

 

 

 

错误的原因之一就是:程序虽然确实分配了内存,但是并不是分配给了程序中的p,而是分配给了它的副本,因为参数传入函数的时候会自动生成副本。

 

11行的GetMemory(p, 6)中的p,其实传的是p的右值,即传的是“hello”字符串的首地址。GetMemory的形参str意思是定义一个指针变量,这个指针变量名叫str,里面保存的内容是个指针。这个str是在栈上分配的,因此函数退出时就消失了。这就解释了为什么传递不了分配的内存。引用的文章里面有图很详细的介绍了这个问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值