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

调用olog()函数连接Oracle 19c数据库出现段错误求助

OCI olog()连接有效数据库时触发段错误解决方案

根因匹配

你遇到的传入无效数据库名返回正常错误、传入有效库名触发段错误的现象,核心原因是OCI依赖的核心结构体未初始化:连接成功后OCI需要向关联结构体写入数据,未初始化的内存脏数据会触发非法访问;连接失败时未走到内存写入逻辑,因此只会返回错误不会崩溃。

具体修复步骤

  • 步骤1:初始化LDA和HDA内存块

    调用olog()前必须将Lda_Def类型的lda、HDA数组全部清零,OCI内部依赖这两个内存块的初始状态为0,随机脏数据会导致野指针访问。
    将以下代码添加到logon()函数开头:
    memset(&lda, 0, sizeof(Lda_Def));
    memset(hda, 0, sizeof(hda));
    
  • 步骤2:修正HDA数组定义

    避免自定义HDA_SIZE带来的大小计算错误,直接按照Oracle官方要求定义HDA为256字节的无符号字符数组:
    // 替换原有hda定义
    ub1 hda[256];
    
  • 步骤3:修正函数语法适配现代编译器

    你当前使用的K&R风格C语法在现代GCC下可能存在参数传递隐式错误,修改为标准C语法:
    1. main函数修改为:
    int main(int argc, char **argv)
    
    1. 函数声明补充完整参数列表:
    void logon(void);
    void err_report(Cda_Def *cursor);
    
  • 步骤4:检查编译选项

    编译时添加旧OCI接口兼容宏,同时确保链接正确的19c客户端库:
    gcc your_code.c -o oci_test -I$ORACLE_HOME/rdbms/public -L$ORACLE_HOME/lib -lclntsh -DOCI7_COMPAT
    

修改后的logon函数示例

void logon()
{
    // 新增初始化代码
    memset(&lda, 0, sizeof(Lda_Def));
    memset(hda, 0, sizeof(hda));

    if (olog(&lda, (ub1 *)hda, (text *)"skills", -1, (text *)"skill", -1,
        (text *)"ORCLPDB", -1, OCI_LM_DEF))
    {
        err_report((Cda_Def *)&lda);
        exit(OCI_EXIT_FAILURE);
    }

    printf("\n Connected to ORACLE as ocitest\n");
}

完成以上修改后重新编译运行即可解决段错误问题。

内容的提问来源于stack exchange,提问作者mala kumari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:36:04