Как memset инициализирует массив целых чисел-1?

В странице справочника говорится о memset:

#include 
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-байтовое значение)?

61
задан 14 June 2014 в 20:14

1 ответ

Когда все биты числа 0 , его значение также 0 . Однако, если все биты 1 , значение -1 .


, Когда мы пишем int a[2], 4x2 , байты памяти выделяются, который содержит случайные биты / биты мусора -

00110000 00100101 11100011 11110010    11110101 10001001 00111000 00010001


Затем мы пишем memset(a, 0, sizeof(a)). Теперь, memset() не различает int & char. Это работает байт байтом . И однобайтовое представление [1 139] 0 00000000. Так, мы добираемся -

00000000 00000000 00000000 00000000    00000000 00000000 00000000 00000000

Поэтому и a[0] и a[1], инициализируются с [1 140] 0 .


Теперь, позволяет, см. memset(a, -1, sizeof(a)): Один байт для [1 141]-1 11111111. И, мы добираемся -

11111111 11111111 11111111 11111111    11111111 11111111 11111111 11111111

Здесь, и a[0] и a[1] будет иметь значение -1 .


Однако для [1 118]: 1 в байте 00000001 -

00000001 00000001 00000001 00000001    00000001 00000001 00000001 00000001

Так, значение будет - 16843009 .

3
ответ дан 31 October 2019 в 16:21

Другие вопросы по тегам:

Похожие вопросы: