Когда передавать T * & p вместо T * p? - PullRequest
0 голосов
/ 27 июня 2018

Я хотел бы понять разницу между передачей *&p и *p и тем, когда использовать один над другим.

Скажем, у меня есть функция инициализации, подобная следующей.

void init(lua_State *L) {
    L = luaL_newstate(); //allocate new memory to L
}

И в main(), если я пытаюсь получить доступ к L, происходит сбой.

lua_State *L;
init(L);
do_something(L);//crash

Однако, когда я изменяю тип аргумента на lua_State *&L, он больше не падает.

Это потому, что выделение новой памяти меняет значение указателя?

Если так, разве не лучше и безопаснее всегда проходить с *& вместо *?

Есть ли какое-то общее правило по этому поводу?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Я хотел бы понять разницу между передачей * & p и * p и тем, когда использовать один над другим.

Ваша цель - изменить значение L в init и убедиться, что это изменение видно в вызывающей функции.

Передача указателя на init не работает, поскольку любые изменения аргумента являются только локальными изменениями. Это не меняет значение переменной в вызывающей функции. Следовательно, указатель остается неинициализированным в main. Использование неинициализированного указателя в main приводит к неопределенному поведению, которое проявляется как сбой в вашей системе.

Я предлагаю изменить тип аргумента init на ссылку на указатель. Когда вы это сделаете, любые изменения аргумента будут видны в вызывающей функции.

void init(lua_State*& L) {
    L = luaL_newstate(); //allocate new memory to L
    // The new value of L will be visible in the calling function.
}

и используйте его как

lua_State *L;
init(L);
do_something(L);

Предложение по улучшению практики кодирования - всегда инициализируйте ваши автоматические переменные в точке объявления.

lua_State* L = nullptr;
init(L);
do_something(L);
0 голосов
/ 27 июня 2018

Рассмотрим переменную int p, тогда &p означает адрес p, наконец * & p = p, значение p

Теперь рассмотрим переменную int *p, тогда p указывает на адрес p, а *p - это значение переменной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...