调用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语法:- main函数修改为:
int main(int argc, char **argv)- 函数声明补充完整参数列表:
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
相关产品推荐
相关产品推荐

