我最近使用嵌入式c语言编写使用oracle的程序,程序的功能与数据库软件相似,就是只要给我一个sql查询语句我就将查询得到的数据以特定的方式返回。这就要用到SALDA这个结构体。我的程序可以编译通过,但是在执行的时候执行到给SQLDA结构体的V[i]和I[i]分配空间时出错了,执行到如下代码出错:
         for(i=0;i<MAX_ITEMS;i++)
{
select_desc->V[i]=(char *)malloc(1);
select_desc->I[i]=(short *)malloc(sizeof(short));
bind_desc->V[i]=(char *)malloc(1);
bind_desc->I[i]=(short *)malloc(sizeof(short));
}分配空间相关的部分代码:
long ExecSelectSQL(Buffer * father,const char *sql_temp,long max_row_num)
{
EXEC SQL BEGIN DECLARE SECTION;
char *sql_stmt=sql_temp; /*SQL语句变量*/
EXEC SQL END DECLARE SECTION;
long i;

Buffer * pret=father;
 
  /*申请查询描述符*/
  if((select_desc=(SQLDA *)sqlald((int)MAX_ITEMS,(int)MAX_VNAME_LEN,(int)MAX_INAME_LEN))==(SQLDA *)0)
{
fprintf(stderr,"申请查询描述符失败。"); 

return -1;
}
printf("%s  %d\n",__FILE__,__LINE__);
/*申请结合描述符*/
if((bind_desc=(SQLDA *)sqlald((int)MAX_ITEMS,(int)MAX_VNAME_LEN,(int)MAX_INAME_LEN))==(SQLDA *)0)
{
fprintf(stderr,"申请结合描述符失败。"); 

return -1;
}
 
 
/*为数据缓存区和指示符变量数据缓存区申请内存*/
for(i=0;i<MAX_ITEMS;i++)
{
select_desc->V[i]=(char *)malloc(1);
select_desc->I[i]=(short *)malloc(sizeof(short));
bind_desc->V[i]=(char *)malloc(1);
bind_desc->I[i]=(short *)malloc(sizeof(short));
}

/*设置查询描述符最多能够描述的选择列表项数*/
select_desc->N=MAX_ITEMS;
printf("%s  %d\n",__FILE__,__LINE__);
/*准备语句*/
EXEC SQL PREPARE s FROM :sql_stmt;
if(sqlca.sqlcode!=0)
{
fprintf(stderr,"准备SQL[%s]语句出错。  出错代码:[%s] \n",sql_stmt,sqlca.sqlerrm.sqlerrmc);
return -1;
}
/*为语句申明游标*/
EXEC SQL DECLARE C CURSOR FOR s;
if(sqlca.sqlcode!=0)
{
fprintf(stderr,"为语句申明游标出错。  出错代码:[%d] \n",sqlca.sqlcode);
return -1;
} bind_desc->N=MAX_ITEMS;

/*描述结合变量*/
EXEC SQL DESCRIBE BIND VARIABLES FOR S INTO bind_desc;
if(sqlca.sqlcode!=0)
{
fprintf(stderr,"描述结合变量出错。 出错代码:[%d] \n",sqlca.sqlcode);
return -1;
}
/*将结合描述符的结合变量数改为语句中的实际结合变量数*/
bind_desc->N=bind_desc->F;

if(pret==NULL)
{
if(max_row_num<=0)
max_row_num=100000;
pret=CreateBuffer(bind_desc->F,max_row_num,0);
}
printf("%s  %d\n",__FILE__,__LINE__);
/*使用结合描述符打开游标*/
EXEC SQL OPEN C USING DESCRIPTOR   bind_desc;
if(sqlca.sqlcode!=0&&sqlca.sqlcode!=1403)
{
fprintf(stderr,"使用结合描述符打开游标出错。 出错代码:[%d] ,%s.\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
return -1;
}
printf("%s  %d\n",__FILE__,__LINE__);
if(Query_proc(pret)<0)
{
fprintf(stderr,"执行查询语句[%s]出错\n",sql_stmt);
return -1;
}

/*释放选择列表项、占位符、指示符变量所占的内存空间*/
for(i=0;i<MAX_ITEMS;i++)
{
free(select_desc->I[i]);
free(bind_desc->I[i]);
if(select_desc->V[i])
{
free(select_desc->V[i]);
}
if(bind_desc->V[i])
{
free(bind_desc->V[i]);
}
}
printf("%s  %d\n",__FILE__,__LINE__);
/*释放描述符*/
sqlclu(bind_desc);
sqlclu(select_desc);

/*关闭游标*/
EXEC SQL CLOSE C;
if(sqlca.sqlcode!=0)
{
fprintf(stderr,"关闭游标游标出错。 \n");
return -1;
}
printf("%s  %d\n",__FILE__,__LINE__);
father = pret;
return 0;
}各位大哥有知道的吗?熟悉使用嵌入式oracle的也看一下吧!谢谢相告。