main(int argc, char **argv)
{
struct QueryConf_3 qConf;if(_InitDB() < 0) return -1;
if(InitConf_3(&qConf) < 0) return -1;
if(FillDealer(qConf, "EPEPECBJ") < 0) return -1; ----这句有问题地址没有传进来。
 改为if(FillDealer(&qConf, "EPEPECBJ") < 0) return -1;
return 0;
}

解决方案 »

  1.   

    谢谢这位朋友,那个地方确实是我疏忽了,但我想那里并不是问题的关键,
    改正后依然不对,我想既然数组名是数组的首地址,那么机构变量名应该也是首地址。(我猜的,很可能不对)
    其实最开始的程序出错是因为我 realloc 的第二个参数没有加原始大小。
    但加上原始大小后依然 core dumped,这次更加奇怪了。我把所有程序重新贴一下,那位帮我看看#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sqlca.h>
    #include <errno.h>extern int errno;typedef struct DealerInfo {
       unsigned char              id[10];
       unsigned char              name[21];
       unsigned short             index;
    } SD;typedef struct QueryConf {
       SD                         *ptrDealerInfo;
       unsigned short             dealerCount;
    } QC;int _InitDB();
    int InitConf_3(QC *);
    int FillDealer(QC *, const char *);
    int DealError(char *);
    int DealSQLError(char *);
    char * rtrim(char *);int
    main(int argc, char **argv)
    {
       QC qConf;   if(_InitDB()          < 0)                          return -1;
       if(InitConf_3(&qConf) < 0)                          return -1;
       if(FillDealer(&qConf, "EPEPECBJ")  < 0)             return -1;
       free(qConf.ptrDealerInfo);
       return 0;
    }int
    InitConf_3(QC *qConf)
    {
       bzero(qConf, sizeof(QC)); 
       if((qConf->ptrDealerInfo = (SD *)calloc(100, sizeof(SD))) == NULL) {
          return DealError("malloc qConf->ptrDealerInfo error.");
       }
       return 0;
    }int
    FillDealer(QC *qConf, const char *str)
    {
       unsigned short        maxCount = 100;
                char         id[10], name[21];   EXEC SQL DECLARE cur_dealer_info CURSOR FOR
          SELECT a.dealer_id, a.short_name
          FROM dealer_info a, province_info p
          WHERE p.ecc_office_id = :str AND a.province = p.id
          ORDER BY a.dealer_id;
       EXEC SQL OPEN cur_dealer_info;
       if(sqlca.sqlcode != 0)
          return DealSQLError("open cur_dealer_info error.");
       for(;;) {
          if(qConf->dealerCount == maxCount) {
             if((qConf->ptrDealerInfo = (SD *)realloc(
                  (void *)qConf->ptrDealerInfo,
                  sizeof(SD) * (10 + maxCount))) == NULL) {
                DealError("realloc qConf->ptrDealerInfo error.");
                EXEC SQL CLOSE cur_dealer_info;   return -1;
             }
             bzero((qConf->ptrDealerInfo + maxCount), 
                   sizeof(SD) * 10);
             maxCount += 10;
          }
          EXEC SQL FETCH cur_dealer_info INTO :id, :name;
          printf("sqlcode = [%d]\n",sqlca.sqlcode);
          if     (sqlca.sqlcode == 1403) { 
             printf("in break\n");             /* 可以打印出来 */
             break;                            /*  return 0; */
          }
          else if(sqlca.sqlcode != 0   ) {
             DealSQLError("fetch cur_dealer_info error.");
             EXEC SQL CLOSE cur_dealer_info;   return -1;
          }
          rtrim(id);   rtrim(name);
          strcpy((qConf->ptrDealerInfo + qConf->dealerCount)->id  , id);
          strcpy((qConf->ptrDealerInfo + qConf->dealerCount)->name, name);
          (qConf->ptrDealerInfo + qConf->dealerCount)->index = qConf->dealerCount;
          printf("[%3d][%s][%s].\n",
                  qConf->dealerCount,
                  (qConf->ptrDealerInfo + qConf->dealerCount)->id,
                  (qConf->ptrDealerInfo + qConf->dealerCount)->name);
          qConf->dealerCount++;
       }
       printf("breaked");                      /* 不能打印出来 */
       EXEC SQL CLOSE cur_dealer_info;
       printf("count=[%s].\n", qConf->dealerCount);
       return 0;
    }int
    _InitDB()
    {
       unsigned char      usrId[]  = "SYSTEM";
       unsigned char      passwd[] = "MANAGER";   EXEC SQL CONNECT :usrId IDENTIFIED BY :passwd;
       if(sqlca.sqlcode != 0) {
          printf("connect database error, sqlcode = [%d].\n", sqlca.sqlcode);
          return -1;
       }
       return 0;
    }char *
    rtrim(char *str)
    {
       unsigned char   *ptr;
       unsigned int    len;   for(len = strlen(str), ptr = str + len - 1;
           *ptr == ' ' && len > 0;
           *ptr = NULL, ptr--, len--);
       return str;
    }int
    DealError(char *str)
    {
       printf("%s\n", str);
       return -1;
    }int
    DealSQLError(char *str)
    {
       printf("%s\n...[%d][%s].\n", str, sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
       return -1;
    }在上面程序中内存的分配好像是正确无误的,请注意那三处注释,
    程序运行后,可以打印出:"in break",但之后就 core dumped 了,
    没有打印出 "breaked".但我如果把 break; 改成 return 0;虽然没有关闭游标,
    但函数可以正确返回,不会 core dumped.望高手分析
      

  2.   

    你把 qConf->ptrDealerInfo 对应的地址打印出来比较一下就可以了!
      

  3.   

    终于找到原因了,又是愚蠢的错误。这句话 core dumped :   printf("count=[%s].\n", qConf->dealerCount);
                      ^^       ^^^^^^^^^^^^^^^^^^
    类型不匹配。内存分配是正确的。谢谢各位关注 。