malloc & realloc

benice 2002-10-25 10:58:42
我想这样:一个结构(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;
}


...全文
37 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hushuangyang 2002-10-26
  • 打赏
  • 举报
回复
你把 qConf->ptrDealerInfo 对应的地址打印出来比较一下就可以了!

benice 2002-10-26
  • 打赏
  • 举报
回复
终于找到原因了,又是愚蠢的错误。

这句话 core dumped :

printf("count=[%s].\n", qConf->dealerCount);
^^ ^^^^^^^^^^^^^^^^^^
类型不匹配。

内存分配是正确的。

谢谢各位关注 。
benice 2002-10-25
  • 打赏
  • 举报
回复
谢谢这位朋友,那个地方确实是我疏忽了,但我想那里并不是问题的关键,
改正后依然不对,我想既然数组名是数组的首地址,那么机构变量名应该也是首地址。(我猜的,很可能不对)
其实最开始的程序出错是因为我 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.

望高手分析。。。
hushuangyang 2002-10-25
  • 打赏
  • 举报
回复
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;
}

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧