2017-02-14 10 views
0

У меня есть эта «ошибочный» код:Разметка памяти в MemSet

int arr[15]; 
memset(arr, 1, sizeof(arr)); 

memset наборы каждый байт до 1, но так как int, как правило, 4 байта, это не даст желаемый результат. Я знаю, что каждый int в массиве будет активирован до 0x01010101 = 16843009. Поскольку у меня слабое (очень) понимание шестнадцатеричных значений и макетов памяти, может кто-нибудь объяснить, почему он получает инициализацию этого шестнадцатеричного значения? Что будет, если я скажу, 4, вместо 1?

+0

Я не понимаю ваш вопрос, потому что у вас уже есть ответ в вашей первой строке.* memset устанавливает каждый байт в 1 = 0x01, так как int обычно 4 байта * 4 байта будет установлен в 0x01010101. Можете ли вы разъяснить свою слабость понимания в макете памяти? Это может быть более полезно. – UmNyobe

+0

Помните, что 'sizeof (arr)' == 60 (байты) не 15 (целые числа). – acraig5075

+0

Да, я знаю, что я назначаю каждый 1 байт с 4-байтовым значением '1', как 4-байтовое значение может быть присвоено одному байту? @ acraig5075 – Jarvis

ответ

1

Что memset делает

Преобразует значение ч в неподписанные символ и копирует его в каждый из первых количества символов объекта, на который указывает Dest.

Итак, первое ваше значение (1) будет преобразован в неподписанные символ, который занимает 1 байт, так что будет 0b00000001. Затем memset заполнит память всего массива этими значениями. Поскольку int занимает 4 байта на вашем компьютере, значение каждого int int массива будет 00000001000000010000000100000001, которое равно 16843009. Если вы поместите другое значение вместо 1, память массива будет заполняться этим значением.

2

Если я доверяю странице человека

функции

MemSet() записывает LEN байт значения с (преобразуется в неподписанный символ) в строках б.

В вашем случае он преобразует 0x00000001 (как int) в 0x01 (как символ без знака), а затем заполняет каждый байт памяти этим значением. Вы можете поместить 4 из них в int, т. Е. Каждый int станет 0x01010101.

Если у вас было 4, оно было бы переведено в unsigned char 0x04, и каждый int был бы заполнен 0x04040404.

Это имеет смысл для вас?

+1

Несомненно, рекомендуется. @AntoineTrouve – Jarvis

0

Обратите внимание, что memset преобразует свой второй аргумент в unsigned char, который является одним байтом. Один байт - восемь бит, и вы устанавливаете каждый байт на значение 1. Таким образом, мы получаем

0b00000001 00000001 00000001 00000001 

или в шестнадцатеричном

0x01010101 

или десятичное число 16843009. Почему это значение? Потому что

0b00000001000000010000000100000001 = 1*2^0 + 1*2^8 + 1*2^16 + 1*2^24 
            = 1 + 256 + 65536 + 16777216 
            = 16843009 

Каждая группа из четырех двоичных цифр соответствует одной шестнадцатеричной цифре. Начиная с 0b0000 = 0x0 и 0b0001 = 0x1, ваше окончательное значение 0x01010101. С memset(arr, 4, sizeof(arr)); вы получите 0x04040404 и с 12 вы получите 0x0c0c0c0c.