Какая польза от возвращаемого значения memset ()?

90

memset() объявлено, чтобы вернуться void* который всегда является тем же значением, что и адрес, переданный в функцию.

Какая польза от возвращаемого значения? Почему не возвращается void?

острый зуб
источник
2
Какая польза от возвращаемого значения strcat()? Иногда стандартные функции - это то, чем они должны быть , а не то, чем они должны быть.
DevSolar 05
4
@MatthieuM .: Кроме того, возврат товара обычно не нулевой. Даже если возвращаемое значение умещается в регистре, вам обычно необходимо загрузить это значение в регистр. Это имеет небольшую цену.
NPE
15
@sharptooth: функция «убить всех людей», конечно же, вернет количество убитых людей.
индив
2
@MatthieuM .: Тебе не стоит беспокоиться о таких мелочах, но я, конечно, могу. Что, если я пишу компилятор для системы с ограниченными ресурсами? Хммм?
Томас Эдинг

Ответы:

36

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

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

NPE
источник
122

Его можно использовать для объединения вызовов, например:

char a[200];
strcpy(memset(a, 0, 200), "bla");
Джурадж Блахо
источник
9
Да, это определенно вариант использования «цепочки».
Cartesius00 05
6
Я поддержал ответ, потому что это интересный случай. Но в реальной жизни я думаю, что лучше держать вызовы memset и 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

Я столкнулся с этим вопросом, когда погуглил, чтобы узнать, что вернул memset.

У меня есть код, в котором я проверяю одно значение, а затем, если это правда, проверяю, является ли значение нулями.

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

Итак, мой код:

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

Это говорит о цели связывания, перечисленной в предыдущих вопросах, но это пример использования этой техники.

Я оставлю это на усмотрение других, чтобы судить, хорошее это кодирование или нет.

Жерар Николь
источник