[Solved] Double pointer as argument to function


Your example is basically equivalent to this:

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

And that is basically equivalent to this:

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

At this point it should start to become obvious that you are assigning a new value to the pointer, not the pointed-to object. Consider this:

void change(SomeType t)
{
  t = somethingElse;
}

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

In your case, SomeType happens to be string* (or string***) – you are just overwriting a local variable.


To fix your code, just skip the first line in 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;
}

solved Double pointer as argument to function