指针作为函数参数传递的注意事项
指针作为函数参数传递
指针作为参数设计说明:
- 传递输入内存,需要提供内存大小(数组到指针无法知道大小), 并设置为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;
