Для чого використовується повернене значення memset ()?


89

memset()оголошено повернення, void*яке завжди має те саме значення, що і адреса, передана у функцію.

Яка користь від поверненого значення? Чому не повертається void?



2
Яка користь від поверненого значення strcat()? Іноді стандартні функції - це те, чим вони визначені, а не такими, якими вони повинні бути.
DevSolar

4
@MatthieuM .: Крім того, як правило, не повертаються речі пов'язані з ненульовою вартістю. Навіть якщо повернене значення вміщується в реєстрі, вам зазвичай потрібно завантажити це значення в регістр. Це має вартість, хоч і невелику.
NPE

15
@sharptooth: Функція "вбити всіх людей", звичайно, поверне кількість вбитих людей.
indiv

2
@MatthieuM .: Ви б не турбувалися про такі дрібниці, але я, звичайно, можу. Що робити, якщо я пишу компілятор для системи з обмеженими ресурсами? Хммм?
Томас Едінг,

Відповіді:


36

Підпис узгоджується з усіма іншими подібними функціями: memcpy()і strcpy()т. Д. Я завжди думав, що це було зроблено для того, щоб можна було прив'язувати виклики до таких функцій, і в іншому випадку використовувати такі виклики у виразах.

Тим не менш, я ніколи не стикався з реальною ситуацією, коли я відчував би змушення використовувати повернене значення таким чином.


122

Він може бути використаний для ланцюжка дзвінків, як:

char a[200];
strcpy(memset(a, 0, 200), "bla");

9
Так, це точно «ланцюговий» варіант використання.
Cartesius00

6
Я підтримав відповідь, бо це цікавий випадок. Але в реальному житті я вважаю, що краще тримати мемсет і виклики strcpy окремо.
Цветомир Димитров

26
Програмісти C люблять нечитабельний код, тому при розробці стандартної функції необхідна можливість нескінченного ланцюжка.
Чад Шуггінс,

@ChadSchouggins Прочитайте код haskell, і ви знаєте, що c-програмісти насправді досить дослівні;) (думає про регулярний вираз "operator" = ~) ...
BitTickler

Звичайно, у цьому прикладі мало б сенс навіть, навпаки, strcpyповернути вказівник мимо останнього скопійованого. memset(my_strcpy(a, "bla"), 0, a + 200);(подобається std::copy_nі std::fill_nробимо в C ++).
alfC

12

Для того, щоб використовувати функцію як аргумент для іншої функції, наприклад sprintf


1

Я зіткнувся з цим запитанням, коли погуглив, щоб побачити, який мемсет повернувся.

У мене є якийсь код, де я тестую на одне значення, тоді, якщо це правда, перевіряю, чи є значення нулями.

Оскільки в C немає повністю портативного способу перевірки на нулі, мені доводиться запускати memset посередині.

Отже, мій код:

if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )

Це говорить про призначення ланцюгів, перелічених у попередніх питаннях, але це приклад використання цієї техніки.

Я залишаю за собою, щоб інші могли судити, чи це правильне кодування чи ні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.