C++中malloc 有关的问题 求指教

①
unsigned char * pBuf = (unsigned char*)env->GetByteArrayElements(b,0);
aes_encrypt(&ctx, pBuf, pBuf);
jbyteArray ret_ba = env->NewByteArray(16);
env->SetByteArrayRegion(ret_ba, 0, 16, (jbyte*)pBuf);
②
unsigned char * pBuf = (unsigned char*)env->GetByteArrayElements(b,0);
jbyte *pOutBuf = (jbyte*)malloc(16);
aes_encrypt(&ctx, pBuf, pOutBuf);
jbyteArray ret_ba = env->NewByteArray(16);
env->SetByteArrayRegion(ret_ba, 0, 16, (jbyte*)pOutBuf);

请问①和②就差了那么一行 为什么就解决了程序偶尔崩溃的问题

malloc设置了内存空间大小。空间不够就会崩溃

pBuf指向的是一块不知道多大的内存,如果大于16的话,①就没有问题,如果小于16的话,你copy过去的就是一段未知的内存,所以可能会造成崩溃!

就解决了程序偶尔崩溃的问题

其实不是偶尔崩溃,而是C++没有一种机制可以检测你访问了不该访问的内存。
你没有分配空间,那么pOutBuf不知道指向哪里。这根本错误的写法,按理说一种强壮的语言应该100%让它出错。

但是C++不理会,不会主动发现这种错误,结果就是,真正因为这个地址碰巧对上了另一个非常重要的敏感的变量的存储的时候,因为错误地覆盖了这个地址上的数据
,导致出错,变成了偶然事件。

说明aes_encrypt输出的最小长度为16,而pBuf有可能不足16,就会溢出导致崩溃。