2016-11-21 1 views
-2

У меня возникли проблемы с помощью кода ниже:C++ символ без знака распределения вопроса

unsigned char ciphertext[(int)(strlen ((char *)plaintext) * 1.5)]; 

Когда код попадет эту линию на выполнение, он терпит неудачу, когда размер 3687192.

Однако это удается при следующих значениях:

18 
54 
60 
90 
173196 
224100 

Итак, как я могу решить эту проблему?

Sidenote, декларация ДОЛЖНА оставаться в формате unsigned char VARNAME, так как я должен использовать его в процедуре шифрования/дешифрования OPENSSL, для которой требуется переменная unsigned char.

Заранее спасибо.

+3

Вы бежите в предел по размеру кадра стека. Выделите его динамически с помощью 'new char [size];' или используйте 'std :: string'. – Barmar

+2

VLA не являются стандартными C++. –

+3

@Barmar 'std :: vector ' работает еще лучше в этом случае. –

ответ

1

Ответ все в комментариях, но я собираюсь сделать это явным.

Локальные переменные обычно выделяются в стеке. У стека есть пределы, ему не разрешается расти бесконечно большим. Как только вы достигли предела, у вас нет выбора, кроме как назначить переменную в куче.

У вас есть много вариантов, как это сделать, но я буду рекомендовать два. Первый std::vector:

std::vector<unsigned char> ciphertext(strlen ((char *)plaintext) * 3/2, 0); 

Чтобы передать этот массив в другую функцию, используйте &ciphertext[0].

Второй std::unique_ptr:

std::unique_ptr<unsigned char> ciphertext = new unsigned char[strlen ((char *)plaintext) * 3/2]; 
Смежные вопросы