指针作为函数参数传递的注意事项

kongyijin / 2023-05-12 / 原文

指针作为函数参数传递
  指针作为参数设计说明:

  • 传递输入内存,需要提供内存大小(数组到指针无法知道大小), 并设置为const
  • 传递输出内存,同样需要提供内存大小,防止溢出
  • 如果指向函数中创建堆内存,需要传递指针引用或者指向指针的指针
  • 通过返回值只能返回堆中空间,比较危险,需要函数中注释说明,防止内存泄露

  作为参数输入:

//普通指针传递
void PtrFunction(const char* data, int size)  
{
    cout << "sizeof(data) = " << sizeof(data) << endl;
}
void PtrFunction2(const char* data, int size)
{
    cout << "strlen(data) = " << strlen(data) << endl;
    cout << "size = " << size << endl;
}
//经过参数传递 数组会转成指针
void PtrFunction(const char data[])
{
    cout << "sizeof(data) = " << sizeof(data) << endl;
    cout << "strlen(data) = " << strlen(data) << endl;
}
//传递参数 获取数组大小
template<class Ty, size_t Size>
void TestMemArr(Ty(&data)[Size])
{
    cout << "sizeof(data) = " << sizeof(data) << endl;
}

////////////////////////////输入测试//////////////////////////////
PtrFunction(data,sizeof(data)); //指针传入后需要一并传入大小,因为进入函数后无法获得大小
PtrFunction(data);          //改成数组,也无法获取实际大小
TestMemArr(data); //可以用模板
const char* str = "Hello";
PtrFunction2(data, 13);    //或者strlen,只不过strlen获取实际长度,而sizeof获取数组长度('\0')

 

 

  作为参数输出:

//函数内创建内存
char* TestMem()
{
    char buf[1024] = "test";
    return buf;
    //不能返回栈中空间,因为栈中数据出了函数就会被释放
}
void TestMem(char* out)
{
    //函数内创建内存,但是这个更改只在函数内部有效,不会影响到函数外部的指针, 内存泄露!!!
    //因此,函数外部的out指针仍然是未初始化的,并且不会得到函数内部分配的内存。
    out = new char[1024];
}
int TestMem(char** out)
{
    //指针的指针**允许你在函数内部修改函数外部的指针的值。
    int size = 1024;
    *out = new char[size];
    return size;
}

////////////////////////////////输出测试///////////////////////////////////
char* out = nullptr;
TestMem(out);
cout << "out " << (int)out << endl;            //直接输出out的话,不会有任何显示,因为out此时没有指向任何一片内存空间
TestMem(&out);
cout << "&out " << &out << endl;
delete out;
out = nullptr;