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

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

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


person sharptooth    schedule 05.12.2012    source источник
comment
Возможно согласованность с другими mem* функциями, которые в основном возвращают void*?   -  person Component 10    schedule 05.12.2012
comment
thevirtualmachinist.blogspot.co.uk/2010/ 08 /   -  person BoBTFish    schedule 05.12.2012
comment
Хороший простой вопрос, на который Google нетривиального ответа.   -  person Sebastian Mach    schedule 05.12.2012
comment
@BoBTFish В последнем абзаце он делает хорошее замечание. Может быть, и это можно было бы получить в качестве ответа ...   -  person UltraInstinct    schedule 05.12.2012
comment
Какая польза от возвращаемого значения strcat()? Иногда стандартные функции - это то, что они указаны, а не то, чем они должны быть.   -  person DevSolar    schedule 05.12.2012
comment
stackoverflow.com/questions/3561427/strcpy-return-value   -  person NPE    schedule 05.12.2012
comment
Я хотел бы задать обратный вопрос. Какой смысл в возвращаемых значениях void? Разве не лучше всегда что-то возвращать (и чем значительнее, тем лучше)?   -  person Matthieu M.    schedule 05.12.2012
comment
@Matthieu M .: Что ж, я думаю, что во многих случаях возвращать нечего. Как то, что убьет всех людей, функция возврата?   -  person sharptooth    schedule 05.12.2012
comment
@MatthieuM .: Кроме того, возврат товара обычно не равен нулю. Даже если возвращаемое значение умещается в регистре, вам обычно необходимо загрузить это значение в регистр. Это имеет небольшую цену.   -  person NPE    schedule 05.12.2012
comment
@NPE: Я бы не стал особо беспокоиться о таких мелочах. Если функция встроена, это не проблема (значение, если не используется, будет отброшено компилятором); в случае, если функция не встроена и компилятор не использовал регистр в качестве блокнота для этого значения (оптимизация во время выделения регистров), то в любом случае это, вероятно, будет незначительным.   -  person Matthieu M.    schedule 05.12.2012
comment
@sharptooth: Функция kill all people, конечно же, вернет количество убитых людей.   -  person indiv    schedule 05.12.2012
comment
void * используется для возврата любого типа данных .. который определяется динамически. Указатель одного типа не может указывать на другой тип. Поэтому, если пользователь не уверен, какой тип данных должен быть возвращен (например, для случаев с шаблоном) void * - хороший вариант.   -  person codeofnode    schedule 05.12.2012
comment
Прочитав ответы, я думаю, что это может быть правильно. Но, безусловно, будет намного чище, если не объединять их в цепочку и записывать их в виде отдельных строк. Это просто какая-то великая загадка жизни. ржу не могу   -  person Shane Hsu    schedule 12.12.2012
comment
@indiv: ..или указатель на братскую могилу :)   -  person Carl    schedule 14.12.2012
comment
@MatthieuM: Ты не стал бы беспокоиться о таких мелочах, но я определенно мог бы. Что делать, если я пишу компилятор для системы с ограниченными ресурсами? Хм?   -  person Thomas Eding    schedule 19.12.2012
comment
Возвращаемое значение функции и первые параметры вызова функции, вероятно, используют одни и те же временные регистры. Функцию memset можно оптимизировать, чтобы оставить этот регистр нетронутым без дополнительных затрат. Следовательно, при вызове otherFunction (memset (...)); адрес уже будет загружен в первый параметр, и его не нужно загружать снова. Таким образом, за вызовом инструкции для memset можно сразу же последовать вызовом инструкции для другой функции - без необходимости инструкций для загрузки памяти в первый параметр.   -  person le_top    schedule 27.02.2019
comment
В C ++ fill_n возвращает указатель за последним, которому он назначен, что эквивалентно возврату dest + n. Это, в свою очередь, согласуется с тем, что имеет смысл возвращать для обобщенных указателей (итераторов).   -  person alfC    schedule 16.08.2019


Ответы (4)


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

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

person NPE    schedule 05.12.2012

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

char a[200];
strcpy(memset(a, 0, 200), "bla");
person Juraj Blaho    schedule 05.12.2012
comment
Да, это определенно вариант использования «цепочки». - person Cartesius00; 05.12.2012
comment
Я поддержал ответ, потому что это интересный случай. Но в реальной жизни я думаю, что лучше разделить вызовы memset и strcpy. - person Tsvetomir Dimitrov; 12.12.2012
comment
Программисты на C любят нечитаемый код, поэтому при разработке стандартной функции необходимо разрешить бесконечную цепочку. - person Chad Schouggins; 13.12.2012
comment
@ChadSchouggins Прочтите код haskell и вы знаете, что c-программисты на самом деле довольно дословно;) (думает об операторе регулярного выражения = ~) ... - person BitTickler; 23.04.2015
comment
Конечно, в этом примере было бы даже более разумным, наоборот, для strcpy возвращать указатель после последнего скопированного. memset(my_strcpy(a, "bla"), 0, a + 200); (как std::copy_n и std::fill_n в C ++). - person alfC; 16.08.2019

Чтобы использовать функцию в качестве аргумента для другой функции, такой как sprintf

person Noah    schedule 05.12.2012

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

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

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

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

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

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

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

person Gerard Nicol    schedule 20.05.2013