Почему я не могу взять адрес возвращаемого значения?

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

Я заполняю этот параметр вызовом геттера и разыменую его:

foo(&bar());

однако я получаю сообщение об ошибке "&" требует l-значение ". Я понимаю, что означает эта ошибка, но я подумал, что смогу сделать это, потому что это указатель, и поэтому он представляет оригинальную "вещь".

Это как-то связано с тем, что фактическое расположение памяти указателей может измениться, даже если оно будет указывать на правильную вещь? но почему он работал раньше, когда он был в том же файле, а не сейчас?

Заранее спасибо!

4 ответа

Решение

Ну, вам нужно lvalue, то есть то, что может быть назначено. Вы не можете присвоить возвращаемое значение функции.

Вам нужно сделать что-то вроде этого:

temp = bar();
foo(&temp);

Используя &, вы не разыменовываете, а ссылаетесь. Для разыменования используйте * вместо: foo(*(bar()));,

И если вы хотите сослаться на это, поместите результат bar() во временной переменной:

x = bar();
foo(&x);

Если предположить, foo принимает указатель на int, попробуйте:

foo((int[]){bar()});

Похоже bar() является:

type *bar () { return member_pointer; }

который возвращает указатель member_pointer по значению, следовательно, не l-vlaue.

Если вы хотите изменить значение member_pointer в foo(), тебе нужно:

type **bar () { return &member_pointer; }
Другие вопросы по тегам