страница руководства говорит о memset
:
#include <string.h> void *memset(void *s, int c, size_t n)
memset()
функция заполняет первуюn
байтов области памяти, на которую указываетs
с постоянным байтомc
,
Очевидно, что memset
не может быть использован для инициализации int
массив, как показано ниже:
int a[10];
memset(a, 1, sizeof(a));
это потому что int
представлен 4 байтами (скажем), и нельзя получить желаемое значение для целых чисел в массиве a
,
Но я часто вижу, как программисты используют memset
установить int
элементы массива либо 0
или же -1
,
int a[10];
int b[10];
memset(a, 0, sizeof(a));
memset(b, -1, sizeof(b));
Согласно моему пониманию, инициализация с целым числом 0
хорошо, потому что 0
может быть представлен в 1 байте (может быть, я ошибаюсь в этом контексте). Но как это можно инициализировать b
с -1
(значение 4 байта)?
Странно, причина, по которой это работает -1
точно так же, как причина того, что это работает с нулями: в двоичное представление дополнения до двух, -1
имеет 1
s во всех его битах, независимо от размера целого числа, поэтому заполнение области байтами, заполненными всеми 1
s производит область -1
подписанный int
s, long
с и short
на двух дополнительных аппаратных.
На оборудовании, которое отличается от двух дополнений, результат будет другим. -1
целочисленная константа будет преобразована в unsigned char
из всех, потому что стандарт специфичен для того, как преобразование должно быть выполнено. Тем не менее, область байтов со всеми установленными битами 1
будет интерпретироваться как интегральные значения в соответствии с правилами платформы. Например, на оборудовании со знаком и величиной все элементы вашего массива будут содержать наименьшее отрицательное значение соответствующего типа.
Когда мы пишем int a[2]
, 4х2 выделяется байт памяти, которая содержит случайные / мусорные биты
00110000 00100101 11100011 11110010 11110101 10001001 00111000 00010001
Потом пишем memset(a, 0, sizeof(a))
, Сейчас, memset()
не различает int
& char
, Оно работает байт за байтом. И одно байтовое представление 0 является 00000000
, Итак, мы получаем
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Поэтому оба a[0]
а также a[1]
инициализируются с 0.
Теперь давайте посмотрим memset(a, -1, sizeof(a))
: Один байт для -1 является 11111111
, И мы получаем
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
Здесь оба a[0]
а также a[1]
будет иметь значение -1.
Однако для memset(a, 1, sizeof(a))
: 1 в байте есть 00000001
—
00000001 00000001 00000001 00000001 00000001 00000001 00000001 00000001
Таким образом, значение будет 16843009.