指针做为参数注意事项

如果一个函数的参数是一个指针,不能用此指针去动态申请内存。
#include <stdio.h>  
#include <iostream>  
using namespace std;  
  
void GetMemory(char *p,int size)  
{  
    p = (char*)malloc(sizeof(char)*size);   //申请内存空间  
}  
void Test()  
{  
    char *str = NULL;  
    GetMemory(str,100);  //str 任然是NULL  
    strcpy(str,"hello");         //运行报错  
}  
int main(void)  
{  
    Test();  
  
    return 0;  
}  


 发送错误是因为:GetMemory()函数中申请内存的时候,函数为参数申请了一个临时副本:_p=p,如果函数体内修改了副本的内容,那么也就修改了P的内容,这就符合了指针作为输出参数的原因,但是在这里,只是把副本_p的内存地址改变了,但是P没有被改变,所以不能返回。


解决办法就是使用“指向指针的指针”去申请内存。实例代码如下:

void GetMemory(char **p,int size)  
{  
    *p = (char*)malloc(sizeof(char)*size);   //申请内存空间  
}  
void Test()  
{  
    char *str = NULL;  
    int n = 10;  
    GetMemory(&str, n);  
    strcpy(str,"hello");    
    cout<<str<<endl;  
    free(str);  
}  


还可以使用返回堆指针的形式(即通过返回值传递动态内存):
char* GetMemory(int size)  
{  
    char *p = (char*)malloc(sizeof(char)*size);   //申请内存空间  
    return p;  
}  
void Test()  
{  
    char *str = NULL;  
    int n = 10;  
    str = GetMemory(n);   
    strcpy(str,"hello");    
    cout<<str<<endl;  
    free(str);  
}  


不要出现下面的情况:编译器报错,p只有在GetMemory()函数中有效,返回后p指向的对象的值被销毁,所以此时指向的值是乱码。

char* GetMemory(int size)  
{  
    char *p[] = "hello world";  
    return p;  
}  
void Test()  
{  
    char *str = NULL;  
    int n = 10;  
    str = GetMemory(n);     
    cout<<str<<endl;  
    free(str);  
}  


下面这种设计方法,虽然编译运行不会报错,但是这种设计方式错误的,因为char* p= “hello world”,申请了一个字符串常量,它存储在静态数据区,在程序的整个生命周期中恒定不变,无论什么时候调用,它返回的始终是同一个只读的内存块,都可以得到hello world的值。
char* GetMemory(int size)  
{  
    char *p = "hello world";  
    return p;  
}  
void Test()  
{  
    char *str = NULL;  
    int n = 10;  
    str = GetMemory(n);    
    cout<<str<<endl;  
    free(str);  
}  


函数参数的默认值只能出现在申明中,不能在定义体中出现,而且顺序只能是从右到左,有时候还会出现二义性。
void func(int a,int b=10);//申明的时候  
void func(int a =10, int b, int c = 2);//报错,顺序只能从右到左  
void func(int a, int b =10)   //报错  
{  
     
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值