memset()
объявлено, чтобы вернуться void*
который всегда является тем же значением, что и адрес, переданный в функцию.
Какая польза от возвращаемого значения? Почему не возвращается void
?
memset()
объявлено, чтобы вернуться void*
который всегда является тем же значением, что и адрес, переданный в функцию.
Какая польза от возвращаемого значения? Почему не возвращается void
?
strcat()
? Иногда стандартные функции - это то, чем они должны быть , а не то, чем они должны быть.
Ответы:
Подпись соответствует всем другим аналогичным функциям: memcpy()
и strcpy()
т. Д. Я всегда думал, что это было сделано для того, чтобы можно было связывать вызовы таких функций и иначе использовать такие вызовы в выражениях.
Тем не менее, я никогда не сталкивался с реальной ситуацией, когда я чувствовал бы себя обязанным использовать возвращаемое значение таким образом.
Его можно использовать для объединения вызовов, например:
char a[200];
strcpy(memset(a, 0, 200), "bla");
strcpy
возвращать указатель после последнего скопированного. memset(my_strcpy(a, "bla"), 0, a + 200);
(нравится std::copy_n
и std::fill_n
делает в C ++).
Я столкнулся с этим вопросом, когда погуглил, чтобы узнать, что вернул memset.
У меня есть код, в котором я проверяю одно значение, а затем, если это правда, проверяю, является ли значение нулями.
Поскольку в C нет полностью переносимого способа проверки нулей, мне приходится запускать memset посередине.
Итак, мой код:
if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )
Это говорит о цели связывания, перечисленной в предыдущих вопросах, но это пример использования этой техники.
Я оставлю это на усмотрение других, чтобы судить, хорошее это кодирование или нет.