Вы не заметите, что оно там, возвращаясь, изменяет вашу структуру, вписав в поля свои представления о прекрасном. Может быть такое? Почему нет?
Я не понимаю, какое отношение этот поток сознания имеет к обсуждаемой функции
sum_vect. Никаких чужих структур она не меняет. Куда девать результат ее выполнения, определяет тот, кто ее вызвал. Может, присвоит куда-нибудь, может, сразу передаст как параметр в другую функцию, а может, сам сделает
return sum_vect(...).
Вы можете записать в массив или даже простую переменную (описанную внутри функции без префикса static) некое значение и прочитать записанное По Этому Адресу уже после завершения вызова функции
Ошибка этих рассуждений в том, что у переменной вообще не обязан быть адрес. Можно, например, написать
register struct vect otvet, и тогда операция взятия адреса у
otvet просто будет запрещена.
Повторюсь, я не вижу принципиальной разницы между возвратом
struct vect и
int. Все ваши рассуждения про
struct vect применимы к
int, кроме одной мелочи, что
struct vect можно менять и по частям (и целиком тоже), а
int только целиком.
-- Сб июл 22, 2023 02:45:40 --Наверно есть причина, почему в API передают структуры по ссылке, а не по значению.
Причин много и они разные.
У
sockaddr фактически сделано наследование, то есть реально по этому указателю лежит другая структура, например,
sockaddr_in. Такое по значению не передается.
timespec - у меня есть разные предположения. Например, чтобы не включать
<time.h> в
<threads.h>. Хотя, наверное, она появилась раньше, чем потоки. Но если она древняя, то при ее проектировании стоило бы подумать о том, что передавать 64-битную структуру по значению в 16-битных архитектурах неэффективно.
WNDCLASSA - большая и сложная структура, которая к тому же владеет ресурсами, например, кистью, поэтому копировать ее, не задумываясь о владении, некорректно.
-- Сб июл 22, 2023 02:58:36 --А возврат структур по значению в сишных API практически не используется, потому что возвращаемое значение часто используется как код возврата.
-- Сб июл 22, 2023 03:01:13 --Вот структура
POINT в WinAPI маленькая и передается по значению:
BOOL PtInRect(
[in] const RECT *lprc,
[in] POINT pt
);
А
RECT - большая.