Подтвердить что ты не робот

Определение и использование Memset

Какова польза функции memset()?.

Определение: Устанавливает первые num байты блока памяти, на которые указывает ptr, на указанное значение (интерпретируется как unsigned char).

Означает ли это, что он жестко кодирует значение в адресе памяти?

memset(&serv_addr,0,sizeof(serv_addr) - пример, который я пытаюсь понять.

Может ли кто-нибудь объяснить это ОЧЕНЬ упрощенным способом?

4b9b3361

Ответ 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. я буду исследовать дальше и сообщать.