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


90

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

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



2
Какая польза от возвращаемого значения strcat()? Иногда стандартные функции - это то, чем они должны быть , а не то, чем они должны быть.
DevSolar 05

4
@MatthieuM .: Кроме того, возврат товара обычно не нулевой. Даже если возвращаемое значение умещается в регистре, вам обычно необходимо загрузить это значение в регистр. Это имеет небольшую цену.
NPE

15
@sharptooth: функция «убить всех людей», конечно же, вернет количество убитых людей.
индив

2
@MatthieuM .: Тебе не стоит беспокоиться о таких мелочах, но я, конечно, могу. Что, если я пишу компилятор для системы с ограниченными ресурсами? Хммм?
Томас Эдинг

Ответы:


36

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

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


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) )

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.