Двойной указатель в качестве аргумента функции - PullRequest
0 голосов
/ 31 августа 2018

Я хочу передать двойной указатель в качестве аргумента функции, но я не вижу, что я делаю неправильно.

#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 голосов
/ 31 августа 2018

Ваш пример в основном эквивалентен этому:

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 / а / 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...