Неожиданное поведение memset ()

Я инициализирую массив с 99 во всех элементах

#include<iostream>
#include<cstring>
int main(){
int a[10];
memset(a,99,10);
std::cout<<a[0]<<std::endl;
return 0;
}

но результат, который я получаю, является неожиданным.

Выход:-

1667457891

В чем причина ненормального поведения этой функции memset?

5

Решение

Во-первых, 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 будет работать на это тоже.

11

Другие решения

Проблема в том, что memset устанавливает каждый байт 99 итак первый int 0x63636363, что равно 1667457891. Использование std::fill вместо.

1

По вопросам рекламы [email protected]