You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:00:44