malloc & realloc
我想这样:一个结构(DealerInfo)用于存放数据库中一张表里的三个字段,另一个结构(QueryConf_3)用于存放指向第一个结构的指针和一个计数器;
初始化时我用malloc给第QueryConf_3里的DealerInfo指针分配100个DealerInfo大小的空间,然后取数据库表,在取完100条记录后,再用realloc给那个结构指针再分配10个DealerInfo大小的空间,一直到取完所有的记录;
运行后,发现在realloc时直接core dump了,:((((((
Bus Error - core dump
哪位大侠帮我看看这是怎么回事啊!~
程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlca.h>
struct DealerInfo {
unsigned char id[10];
unsigned char name[21];
unsigned short index;
};
struct QueryConf_3 {
struct DealerInfo *ptrDealerInfo;
unsigned short dealerCount;
};
int
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;
return 0;
}
int
InitConf_3(struct QueryConf_3 *qConf)
{
bzero(qConf, sizeof(struct QueryConf_3));
if((qConf->ptrDealerInfo = (struct DealerInfo *)
malloc(sizeof(struct DealerInfo) * 100)) == NULL) {
return DealError("malloc qConf->ptrDealerInfo error.");
}
bzero(qConf->ptrDealerInfo, sizeof(struct DealerInfo)*100);
return 0;
}
int
FillDealer(struct QueryConf_3 *qConf, const char *str)
{
unsigned short maxCount = 100;
struct DealerInfo *ptr;
EXEC SQL DECLARE cur_dealer_info CURSOR FOR
SELECT a.dealer_id, a.short_name, a.province
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.");
ptr = qConf->ptrDealerInfo;
for(; {
EXEC SQL FETCH cur_dealer_info INTO tr;
if (sqlca.sqlcode == 1403) break;
else if(sqlca.sqlcode != 0 ) {
DealSQLError("fetch cur_dealer_info error.");
EXEC SQL CLOSE cur_dealer_info; return -1;
}
rtrim(ptr->id); rtrim(ptr->name);
if(qConf->dealerCount == maxCount) {
if(realloc((void *)qConf->ptrDealerInfo,
sizeof(struct DealerInfo) * 10) == NULL) {
DealError("realloc qConf->ptrDealerInfo error.");
EXEC SQL CLOSE cur_dealer_info; return -1;
}
bzero((qConf->ptrDealerInfo + maxCount),
sizeof(struct DealerInfo) * 10);
maxCount += 10;
}
printf("[%3d][%s][%s][%d].\n", qConf->dealerCount, ptr->id, ptr->name, ptr->index);
ptr->index = qConf->dealerCount++; ptr++;
}
EXEC SQL CLOSE cur_dealer_info;
printf("count=[%s].\n", qConf->dealerCount);
return 0;
}
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;
}