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 ++).
Я зіткнувся з цим запитанням, коли погуглив, щоб побачити, який мемсет повернувся.
У мене є якийсь код, де я тестую на одне значення, тоді, якщо це правда, перевіряю, чи є значення нулями.
Оскільки в C немає повністю портативного способу перевірки на нулі, мені доводиться запускати memset посередині.
Отже, мій код:
if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )
Це говорить про призначення ланцюгів, перелічених у попередніх питаннях, але це приклад використання цієї техніки.
Я залишаю за собою, щоб інші могли судити, чи це правильне кодування чи ні.