双指针作为函数的参数

Double pointer as argument to function

本文关键字:参数 函数 指针      更新时间:2023-10-16

我想将双指针作为参数传递给函数,但我看不到我做错了什么。

#include <iostream>
#include <string> 
using namespace std;
void changeString(string ***strPtr) {
strPtr = new string**[1];
*strPtr = new string*[1];
**strPtr = new string("hello");
//cout << strPtr[0][0][0];
}
int main()
{
string **strPtr;
changeString(&strPtr);
//cout << strPtr[0][0];
return 0;
}

changeString中的cout工作正常,但main中的cout会引发异常read access violation. strPtr was 0xCCCCCCCC.

你的例子基本上等效于这个:

void changeString(string **strPtr) {
strPtr = new string*[1];
*strPtr = new string("hello");
//cout << strPtr[0][0];
}
int main()
{
string *strPtr;
changeString(&strPtr);
//cout << strPtr[0];
return 0;
}

这基本上等同于这个:

void changeString(string *strPtr)
{
strPtr = new string("hello"); // Changes the pointer, not the string!
//cout << strPtr[0];
}
int main()
{
string str;
changeString(&str);
//cout << str;
return 0;
}

此时,应该开始变得很明显,您正在为指针而不是指向的对象分配一个新值。考虑一下:

void change(SomeType t)
{
t = somethingElse;
}
int main()
{
SomeType t;
change(t); // Does not change t.
}

在您的情况下,SomeType恰好是string*(或string***(的 - 您只是覆盖了一个局部变量。


要修复您的代码,只需跳过changeString中的第一行:

http://coliru.stacked-crooked.com/a/88874ee3601ef853

void changeString(string ***strPtr)
{
*strPtr = new string*[1];
**strPtr = new string("hello");
cout << strPtr[0][0][0];
}
int main()
{
string **strPtr;
changeString(&strPtr);
cout << strPtr[0][0];
return 0;
}