C++——指针作为函数参数传递需要注意的问题
指针作为函数参数传递的一些问题总结:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
void func(char* q)
{
q = (char*)malloc(100);
}
int main(){
char* p = nullptr;
func(p);
//报错,段错误,因为此时的p没有被分配内存空间
strcpy(p,"hello world");
cout<<p<<endl;
free(p);
return 0;
}
原因:指针p作为函数参数传递的时候,传的是指针的值,即指针指向的内存地址,形参q接收了这个值,但是形参q自己的地址和p的地址不一样,
因为q是在栈区临时分配的地址。即有p==q,但是&p != &q,所以在函数中使用malloc重新分配内存,赋值给q,并不会改变主函数中的p,此时p != q;
因此如果函数的参数是一个指针,不要指望用这个指针去申请动态内存,只能通过这个指针去改变其指向内存地址的内容
错误解决方法
代码正确写法1:传递指针的引用,这样&q==&p,q和p就是同一个地址
void func(char* &q)
{
q = (char*)malloc(100);
}
int main(){
char* p = nullptr;
func(p);
//正常,不会报错
strcpy(p,"hello world");
cout<<p<<endl;
free(p);
return 0;
}
代码正确写法2
可以返回新分配的内存地址给主函数的p,因为此处的q是在堆上分配的内存,函数结束后不会被立即回收,所以可以返回,但如果是栈上的临时变量就不可以返回
char* func(char* q)
{
q = (char*)malloc(100);
return q;
}
int main(){
char* p = nullptr;
p = func(p);
//正常,不会报错
strcpy(p,"hello world");
cout<<p<<endl;
free(p);
return 0;
}
代码正确写法3
使用指向指针的指针来为p分配内存
void func(char** q)
{
*q = (char*)malloc(100);
}
int main(){
char* p = nullptr;
func(&p);
//正常,不会报错
strcpy(p,"hello world");
cout<<p<<endl;
free(p);
return 0;
}
总而言之,指针作为参数时,不能在函数体中改变指针的内存地址,要不然,实参的拷贝(压入栈中),即形参改变了,而实参没有改变,
会造成内存泄露并且还达不到分配内存的效果,容易出bug
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了