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;
}
初始化时我用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;
}
...全文
相关推荐
c语言中malloc、realloc与calloc 的区别以及联系
**realloc的特殊情况**: - 如果realloc的`ptr`参数为NULL,它会像malloc一样分配`new_size`字节的内存。
C语言动态内存分配之malloc与realloc区别
"C语言动态内存分配涉及到malloc、realloc和calloc等函数,它们是程序在运行时动态管理内存的重要工具。动态内存分配允许程序员根据需要在堆上分配和释放内存,而不是在编译时预设固定大小。这
C程序设计期末考试习题库(仅供参考).pdf
内存管理:C语言提供了动态内存分配的函数,如malloc、calloc、realloc和free。例如,使用malloc进行动态内存分配。14.
heaptrace:跟踪 malloc、realloc 和 free 调用
本文介绍了一种通过动态链接库钩子技术来跟踪和记录程序中malloc、realloc及free函数调用的方法。该代码实现了对内存分配与释放过程的监控,并能在每次操作时输出对应的函数名称及相关参数。
浅谈malloc,calloc,realloc.pdf
### 浅谈malloc、calloc、realloc函数的区别及应用#### 一、引言在C语言编程中,动态内存管理是非常重要的一个方面。


基础和管理
