Определение и использование Memset
Какова польза функции memset()
?.
Определение: Устанавливает первые num байты блока памяти, на которые указывает ptr, на указанное значение (интерпретируется как unsigned char).
Означает ли это, что он жестко кодирует значение в адресе памяти?
memset(&serv_addr,0,sizeof(serv_addr)
- пример, который я пытаюсь понять.
Может ли кто-нибудь объяснить это ОЧЕНЬ упрощенным способом?
Ответы
Ответ 1
memset()
- очень быстрая версия относительно простой операции:
void* memset(void* b, int c, size_t len) {
char* p = (char*)b;
for (size_t i = 0; i != len; ++i) {
p[i] = c;
}
return b;
}
То есть memset(b, c, l)
устанавливает байты l
, начинающиеся с адреса b
, до значения c
. Он просто делает это намного быстрее, чем в приведенной выше реализации.
Ответ 2
memset()
обычно используется для инициализации значений. Например, рассмотрим следующую структуру:
struct Size {
int width;
int height;
}
Если вы создаете один из них в стеке так:
struct Size someSize;
Тогда значения в этой структуре будут undefined. Они могут быть равны нулю, они могут быть любыми значениями, которые произошли там, когда последняя часть последнего использовалась. Поэтому обычно вы должны следовать этой строке с помощью:
memset(&someSize, 0, sizeof(someSize));
Конечно, он может использоваться для других сценариев, это только один из них. Просто подумайте об этом как о способе просто установить часть памяти на определенное значение.
Ответ 3
memset
- это обычный способ установить область памяти в 0 независимо от типа данных. Можно сказать, что memset
не заботится о типе данных и просто устанавливает все байты в ноль.
IMHO на С++ следует избегать memset
, когда это возможно, поскольку он обходит безопасность типов, предоставляемую С++, вместо этого следует использовать конструктор или инициализацию как средство инициализации. memset, выполненный над экземпляром класса, также может непреднамеренно уничтожить:
например.
class A
{
public:
shared_ptr<char*> _p;
};
a memset
в экземпляре выше не будет правильно выполнять декремент счетчика ссылок.
Ответ 4
Я предполагаю, что serv_addr
- это локальная или глобальная переменная некоторого типа struct
- возможно, struct sockaddr
- (или, возможно, class
).
&serv_addr
берет адрес этой переменной. Это действительный адрес, заданный как первый аргумент memset
. Второй аргумент memset
- это байт, который будет использоваться для заполнения (нулевой байт). Последний аргумент memset
- это размер в байтах этой зоны памяти для заполнения, размер которой в вашем примере равен serv_addr
.
Итак, этот вызов memset
очищает глобальную или локальную переменную serv_addr
, содержащую некоторые struct
.
На практике компилятор GCC, когда он оптимизирует, будет генерировать для этого умный код, обычно разворачивая и вставляя его (на самом деле, он часто является встроенным, поэтому GCC может генерировать для него очень умный код).
Ответ 5
Это не что иное, как установка памяти на конкретное значение.
Вот пример кода.
Memset (const * p, unit8_t V, unit8_t L) Здесь P является указателем на целевую память, V - значением целевого буфера, который будет установлен в значение V, а l - длина данных.
while(L --> 0)
{
*p++ = V;
}
Ответ 6
memset- установить байты в памяти
Сводка -
#include<string.h>
void * memset (void * s, int c, size_t n)
Описание- Функция memset() должна копировать c (преобразован в unsigned char) в каждый из первых n байтов объекта, на который указывает s.
Здесь для указанной функции memset() возвращает значение s.
Ответ 7
Я также ищу - зачем использовать memset
хотя вот что-то случилось со мной.
Я использовал strncpy (dest, source, количество символов) и получал некоторые неправильные результаты.
хотя я был уверен в размере целевого массива.
поэтому, когда я использовал memset перед strncpy, я получил отличные правильные результаты для вывода strncpy.
я буду исследовать дальше и сообщать.