Зачем ставить '*' на функции, которые возвращают указатель структуры? - PullRequest
0 голосов
/ 20 апреля 2011

Я столкнулся с проблемой, когда я объявил функцию следующим образом:

struct my_struct get_info();

Он должен возвращать указатель на структуру, а затем в main этот указатель захватывается, например так:

struct my_struct *p_struct;
p_struct = get_info();

Затем я получил ошибку компилятора, говорящую о том, что он не может конвертировать из 'my_struct *' to 'my_struct. Я посмотрел вокруг кода, который делает то же самое, и заметил, что в их прототипе и определении функции они имели * перед именем функцииПример:

struct my_struct *get_info();

После того, как я добавил в *, все было хорошо.Я не знаю, почему это все исправляет, и почему вы это сделаете.Вы делаете это только при возврате указателя структуры?Или есть другие случаи, которые вы хотели бы сделать это?Спасибо.

Ответы [ 4 ]

1 голос
/ 20 апреля 2011

Это должно вернуть указатель на структуру

Но ваш код не возвращает указатель на структуруЭто так?

Разве вы не имели в виду struct my_struct* get_info();?

1 голос
/ 20 апреля 2011

struct my_struct* обозначает простой указатель.Поэтому, когда вы хотите вернуть указатель, тип возвращаемого значения должен быть также указателем, не так ли?
Вы можете записать это struct my_struct *get_info(); как struct my_struct* get_info();, что может больше подсказывать вам, какой реальный тип возврата для вас.* принадлежит этому типу возвращаемого значения, а не самой функции.

0 голосов
/ 20 апреля 2011

Суть в том, что ваш код был непоследователен - было сказано «вернуть указатель на переменную структуры» в функции, объявленной для непосредственного возврата структуры.Это разные вещи.Вы, кажется, думаете, что компилятор может угадать или узнать, что было ошибкой, возможно, думая, что люди всегда возвращают структуры по указателю, но это не так, и действительно, компилятор не может знать наверняка, поэтому лучшее, что он может сделать, чтобыУбедитесь, что программа работает, как задумано, настаивайте на том, чтобы вы - программист - вернулись к коду и сделали его согласованным.

0 голосов
/ 20 апреля 2011

Вы можете передавать (struct) s по значению, а не как указатели.Обычно это не очень хорошая идея (используйте ссылки или указатели, если необходимо).Поэтому вам нужно использовать & для ссылки или * для указателя, иначе он будет ожидать, что вы вернете его по значению.

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