2016-03-29 3 views
0

Я смущен о следующем коде:MemSet() не работает, как ожидалось

#include<iostream> 
#include<cstring> 

int main() 
{ 
    int arr[3][4]; 
    memset(arr, 10, sizeof(arr)); 
    for(int i = 0; i < 3; ++i) 
    { 
     for(int j = 0; j < 4; ++j) 
      std::cout<<arr[i][j]<<" "; 
     std::cout<<"\n"; 
    } 

    return 0; 
} 

Выход:

168430090 168430090 168430090 168430090 
168430090 168430090 168430090 168430090 
168430090 168430090 168430090 168430090 

я ожидал работает приведенный выше код будет печатать

10 10 10 10 
10 10 10 10 
10 10 10 10 

Может кто-нибудь объяснить причину этого странного поведения?

+0

* memset() не работает должным образом * - memset работает правильно. Это зависит от вас, чтобы предоставить соответствующие параметры. Если вы хотели что-то, что делало что-то дистанционно, то, что вы пытаетесь выполнить, есть [std :: fill] (http://en.cppreference.com/w/cpp/algorithm/fill) – PaulMcKenzie

+1

Функция 'memset' не имеет понятия, что это массив 'int' и поэтому не имеет понятия, как дать им правильный шаблон для декодирования как 10. –

ответ

6

Becase int имеет длину более одного байта. memset() заполняет каждый байт заданным значением. Итак, каждый байт вашего 4-байтового ints содержит 10.

3

memset будет обрабатывать переданную память как указатель на байты. Каждый байт будет установлен в 10, а не каждый int.

Таким образом, вы печатаете 0x0a0a0a0a или 168430090 для каждого int.