Инициализация объекта массива требует использования списка инициализатора фигурной скобки, то есть что-то вроде
char charchar_value[MAX_VARCHAR_LENGTH + 1] = { val_0, val_1, /*...*/ val_n };
Это приведет к инициализации первых n
значений их соответствующими значениями, а всех остальных - к нулю. Это не совсем то, что вы хотите. Единственный способ установить значения в массиве - после его инициализации, например, используя std::fill()
std::fill(std::begin(charchar_value), std::end(charchar_value),
std::numeric_limits<char>::min());
Так как есть еще одно предложение, рекомендующее использовать по существу подход C:
- Использование
memset()
ограничено типами без каких-либо функций C ++ (как, впрочем, и в случае char
), а при установке значения, отличного от 0
, оно в значительной степени ограничено char
(да, я понял, что есть случаи, когда это все равно будет работать). std::fill()
, с другой стороны, работает с любым типом, который является CopyAssignable, и с любым значением, присваиваемым объекту соответствующего типа.
- Хотя использование
sizeof()
в этом случае работает, оно не сработает, как только размер станет динамическим, но компилятор все равно с радостью примет код. Получить указатель std::begin()
или std::end()
не удастся.
- В контексте, где тип точно не известен, например, если это typedef или шаблон, у
std::numeric_limits<T>::min()
больше шансов на работу. Это все еще не будет работать для многих типов, так как не определено min()
, но область действия больше.
Все это говорит о том, что я бы вместо этого использовал соответствующий класс, который выполняет инициализацию напрямую, т.е.
std::vector<char> charchar_value(MAX_VARCHAR_LENGTH + 1,
std::numeric_limits<char>::min());
Это распределяет память динамически, то есть не полностью эквивалентно. Однако, если нет веских оснований предполагать обратное, я бы использовал простой подход и оптимизировал его, только если это необходимо.