指针作为参数传递时的陷阱,内部操作指针指向的地址(指针的栈内容),而不是操作指针指向的内存(指针的堆内容),函数内申请指针内存

指针作为参数传递时的陷阱:内部操作了指针指向的地址(指针的栈内容),而没有操作指针指向的内存(指针的堆内容),从而导致程序运行不如意。

此处以:传入指针在函数内申请空间的经典错误为例
指针经典错误操作:在传入函数中申请内存

void GetMemory(char *p, int num)
{
p = (cahr *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100);//str在这里仍然为NULL
strcpy(str, “hello”);//运行错误,str中没有内存空间用来复制
}

错误原因:
函数传参时,编译器为函数的每个参数准备了副本,在这里面str的副本就是p,传参之后,str指向Null,p指向str,函数体中给p申请了内存,就将p从指向str改为指向一片新申请的内存空间,str没有变化,仍然指向Null,函数体返回后,程序并没有指针接收临时指针变量申请的内存,导致申请的内存失去访问能力,造成内存泄露。

解决方法:
一:使用指向指针的指针,取引用获得外部指针并申请内存。

void GetMemory(char **p, int num)
{
*p = (cahr *)malloc(sizeof(char) * num);//使用指向指针的指针,
//对其解引用,(*p)等价与str
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);//传入str的地址
strcpy(str, “hello”);
}

二、将申请好内存的指针作为返回值返回出去由外部接收
char *GetMemory(char *p, int num)
{
p = (cahr *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
str = GetMemory(str, 100);
strcpy(str, “hello”);
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 中,如果需要函数传递一个指针并修改指针指向作为参数返回,可以使用指针类型的引用或者指针指针。具体步骤如下: 1. 使用指针类型的引用 定义函数函数参数使用指针类型的引用,例如: ``` void func(int* &ptr) { ptr = new int(123); // 修改指针指向内存空间 } ``` 上述代码定义了一个名为 `func` 的函数,该函数参数为一个指针类型的引用,类型为 `int*&`。在函数中使用 `new` 运算符分配一个 `int` 类型的内存空间,并将指针 `ptr` 指向内存空间。 在调用函数,需要使用指针类型的引用: ``` int* ptr = nullptr; func(ptr); // 调用函数 // 现在,ptr 指向一个值为 123 的内存空间 ``` 上述代码中,定义了一个指针变量 `ptr`,并将其传递给函数 `func`。 2. 使用指针指针 定义函数函数参数使用指针指针,例如: ``` void func(int** ptr) { *ptr = new int(123); // 修改指针指向内存空间 } ``` 上述代码定义了一个名为 `func` 的函数,该函数参数为一个指针指针,类型为 `int**`。在函数中使用 `new` 运算符分配一个 `int` 类型的内存空间,并将指针指针 `ptr` 指向内存空间。 在调用函数,需要使用指针指针: ``` int* ptr = nullptr; func(&ptr); // 调用函数 // 现在,ptr 指向一个值为 123 的内存空间 ``` 上述代码中,定义了一个指针变量 `ptr`,并将其地址传递给函数 `func`。 以上就是使用指针类型的引用或者指针指针来传递指针并修改指针指向并作为参数返回的步骤。需要注意的是,在使用指针类型的引用或者指针指针,需要确保指针指向内存空间已经分配,否则可能会导致指针访问非法内存空间。另外,记得在使用完指针后,需要手动释放指针指向内存空间,避免内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值