2016-11-21 39 views
-2

我使用下面的代码有一个问题:C++无符号的字符分配问题

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

当代码击中执行这条线,当尺寸为3687192失败。

然而,它成功用于以下值:

18 
54 
60 
90 
173196 
224100 

所以,我怎么能解决这个问题?

旁注,声明必须保持格式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];