求助:在C语言中创建OpenSSL BIGNUM类型矩阵遇到问题
问题分析与修复方案
首先看你的代码里的几个关键问题:
1. 数组初始化错误
你写的 BIGNUM *p [2][2] = NULL; 是错误的——二维指针数组不能直接用NULL初始化。数组在栈上分配内存,每个元素是BIGNUM*类型,正确的做法是要么让编译器自动初始化为NULL(省略初始化器),要么显式初始化每个元素为NULL:
// 方式1:让编译器默认初始化所有元素为NULL BIGNUM *p[2][2]; // 方式2:显式初始化 BIGNUM *p[2][2] = {NULL};
2. 指针赋值错误
循环里的 *p[i][j] = BN_new(); 完全搞错了指针的用法:
p[i][j]本身就是一个BIGNUM*类型的变量BN_new()返回的是一个指向新分配BIGNUM结构的指针- 你不需要解引用(
*),直接把返回值赋值给p[i][j]就行,解引用的话会访问未初始化的空指针,直接导致程序崩溃。
修复后的完整代码
#include <openssl/bn.h> int main() { // 声明二维指针数组,编译器默认初始化所有元素为NULL BIGNUM *p[2][2]; int i, j; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { // 直接将BN_new()返回的指针赋值给p[i][j] p[i][j] = BN_new(); // 可选:检查BN_new是否分配成功(避免内存分配失败导致后续错误) if (p[i][j] == NULL) { // 这里可以添加错误处理逻辑,比如释放已分配的内存后退出 return 1; } } } // 使用完矩阵后,记得释放每个BIGNUM的内存 for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { BN_free(p[i][j]); } } return 0; }
额外提示
- 一定要记得用
BN_free()释放每个BIGNUM对象,避免内存泄漏 - 每次调用
BN_new()后最好检查返回值,因为内存分配可能失败 - 如果需要动态创建任意大小的矩阵,建议用动态分配的二维指针数组(比如
BIGNUM ***p),而不是固定大小的栈数组
内容的提问来源于stack exchange,提问作者user171635
相关产品推荐
相关产品推荐

