Я инициализирую массив с 99 во всех элементах
#include<iostream>
#include<cstring>
int main(){
int a[10];
memset(a,99,10);
std::cout<<a[0]<<std::endl;
return 0;
}
но результат, который я получаю, является неожиданным.
Выход:-
1667457891
В чем причина ненормального поведения этой функции memset?
Во-первых, memset
принимает размер в байтах, а не количество элементов массива, потому что он не может знать, насколько велик каждый элемент. Вам нужно использовать sizeof
чтобы получить размер в байтах массива и передать его memset
вместо:
memset(a, 99, sizeof(a));
Однако в С ++ предпочитают std::fill
потому что он безопасен от типов, более гибок и иногда может быть более эффективным:
std::fill(begin(a), end(a), 99);
Вторая и более насущная проблема заключается в том, что memset
а также fill
в этом случае поведение будет другим, поэтому вы должны решить, что вам нужно: memset
установит каждый байт до 99, тогда как fill
установит каждый элемент (каждый int
в вашем случае) до 99. Если вы хотите массив, полный целых чисел, равных 99, используйте fill
как я это показал. Если вы хотите, чтобы каждый байт был установлен в 99, я бы рекомендовал int*
к char*
и используя fill
на этом вместо memset
, но memset
будет работать на это тоже.
Проблема в том, что memset
устанавливает каждый байт 99
итак первый int
0x63636363, что равно 1667457891. Использование std::fill
вместо.