指数参数如何传递内存

先来看一段有问题的code:

void GetMemory(char *p,int num)

{

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

}

void Test(void)

{

   char *str = NULL;

   GetMemory(str,100); //str is still NULL

   strcpy(str,"hello"); // Run error!

}

问题在于函数GetMemory(),编译器总是要为参数的每个参数制作临时副本,指正参数p的副本是_p,编译器是_p=p。在此函数中,_p申请了新的内存,只是把本身的值改变了,即指向了新的内存空间,但p本身未变(修改了_p的值而不是_p指向的对象),事实上运行此函数后还会造成内存泄露。

如果非得用指针参数去申请内存,可改用“指向指针的指针‘或”指针的引用“:

void GetMemory2(char **p, int num)  // or (char *& rp,int num)

{

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

}

或者可以通过返回值来传递动态内存,更简单:

char* GetMemory3(int num)

{

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

  return p;

}

另外,注意返回“栈内存”的指针问题:

char* GetString(void)

{

  char p[] = "hello world";

  return p;                             //  this memory will be freed after the func is called and run over

}

但不同的是:

char* GetString(void)

{

  char *p= "hello world";

  return p;                            

}

此函数是可以的,因为此时p指向内容作为常量字符串“hello world",位于静态存储区,在程序生命周期内始终有效,但不建议这样的用法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值