双指针作为函数的参数

时间:2018-08-31 08:27:25

标签: c++ pointers

我想将双指针作为函数的参数传递,但是我看不到自己在做什么错。

#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;
    }

cout中的changeString工作正常,但是cout中的main抛出异常read access violation. strPtr was 0xCCCCCCCC.

1 个答案:

答案 0 :(得分:3)

您的示例基本上与此等效:

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;
}

在这一点上,您正在为 pointer 而不是 pointed-to 对象分配新值应该变得很明显。考虑一下:

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;
}