Intereting Posts
Почему Chrome на Linux показывает диалог «Запрос внешнего протокола» для неизвестного протокола? Java Не удается подключиться к серверу окон X11, используя «localhost: 10.0» в качестве значения переменной DISPLAY Найти команду, которая возвращает номер строки строки Можно ли поставить Cygwin на DVD для автономной установки? Ошибка настройки wildfly в качестве службы Windows Неизвестная ошибка хоста при выполнении установки MVN Хостинг 50+ сайтов с поддержкой Node.js (стек: Forever, Express, Nginx и Let’s Encrypt) Можно ли перенаправить вывод командного файла внутри скрипта? Поле заголовка запроса «Недопустимый запрос размера» превышает лимит сервера. авторизация Как найти местоположение MySQL my.cnf Ошибка при использовании CMake с LLVM Как поддерживать IPv4 и IPv6 на Java Почему FindFirstFile / FindNextFile иногда видит файл в сетевой папке, но CopyFile нет? gdb, похоже, игнорирует исполняемые возможности Удалить все файлы определенного типа, кроме одного типа в linux-терминале

В чем разница, передавая непосредственно функцию sizeof () для функции и предыдущую объявленную и инициализированную переменную?

Например, я хотел бы знать, есть ли существенная разница или хорошая / плохая практика

Таким образом:

unsigned int length_addr; length_addr = sizeof(cli_addr); nbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cli_addr, &length_addr); 

и таким образом:

 nbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cli_addr, sizeof(cli_addr)); 

Да, есть существенная разница.

  • В первом случае вы передаете адрес unsigned int , в основном, insigned int * .

  • Во втором случае вы передаете результат оператора sizeof типа size_t .

Они не одинаковы.

Тем не менее, согласно странице руководства, в основном оба неверны. Последний аргумент должен быть типа socklen_t * , поэтому лучше придерживаться правильных типов.

На самом деле разница. Как сказал кто-то, существует большая разница между передачей адреса (первая ситуация) или значением (size_t) (вторая ситуация). Если вы проверите справочную ссылку recvfrom, вы увидите, что последний аргумент является указателем на пространство памяти, размер которого имеет размер sockaddr предыдущего аргумента.

 #include  ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len); /*address_len Specifies the length of the sockaddr structure pointed to by the address argument.*/ 

Первый из них действительно правильный, поскольку вы указываете lenght_addr размер cli_addr, а затем передаете указатель в качестве аргумента. Поэтому он должен работать нормально.