当前位置: 技术问答>linux和unix
极具挑战性的问题:动态申请内存,再用来存储二维字符串数组
来源: 互联网 发布时间:2015-10-15
本文导语: 用C写了一个操作MySql的程序,想将操作MySql后得到的数据写入到一个结构中去,以便以后处理,这个结构如下: struct mysqlAdo { int nFlag; //操作结果标志,0:成功,其它表示失败 int nRow; //结果集的行数 int nCol; //结果集的列数 ...
用C写了一个操作MySql的程序,想将操作MySql后得到的数据写入到一个结构中去,以便以后处理,这个结构如下:
struct mysqlAdo
{
int nFlag; //操作结果标志,0:成功,其它表示失败
int nRow; //结果集的行数
int nCol; //结果集的列数
char pData[][]; //存放结果集
}
那三个整形数据没有问题,就是最后一个,我的这个定义可能是错误的,意思就是这样的:用pData[0][1]就可以取出结
果集的第0行,第2列的数据,以此类推,我现在不知道怎样定义这个pData好一点,也不知道该怎样为其申请内存空间,再
怎样释放,因为这一切都是动态的,不知道结果集的总字节是多少,也不清楚怎样在分配的空间中划分成一个二维字符
串数组的样子,也不清楚如何将数据写入这个结构中,都愁死了,我的LINUX基础很不好,VC++倒还可以,但用纯C来完成
这个东东,真是没有思路,请大家帮忙了多谢.
struct mysqlAdo
{
int nFlag; //操作结果标志,0:成功,其它表示失败
int nRow; //结果集的行数
int nCol; //结果集的列数
char pData[][]; //存放结果集
}
那三个整形数据没有问题,就是最后一个,我的这个定义可能是错误的,意思就是这样的:用pData[0][1]就可以取出结
果集的第0行,第2列的数据,以此类推,我现在不知道怎样定义这个pData好一点,也不知道该怎样为其申请内存空间,再
怎样释放,因为这一切都是动态的,不知道结果集的总字节是多少,也不清楚怎样在分配的空间中划分成一个二维字符
串数组的样子,也不清楚如何将数据写入这个结构中,都愁死了,我的LINUX基础很不好,VC++倒还可以,但用纯C来完成
这个东东,真是没有思路,请大家帮忙了多谢.
|
#pragma pack(1)
typedef struct mysqlAdo
{
int nFlag; /*操作结果标志,0:成功,其它表示失败*/
int nRow; /*结果集的行数*/
int nCol; /*结果集的列数*/
char pData[1]; /*存放结果集*/
}mysqlAdo;
#pragma pack()
__inline char * GetArray(mysqlAdo *pThis, int x)/*取第x行*/
{
return pThis->pData+pThis->nCol*x;
}
__inline char GetCharVal(mysqlAdo *pThis, int x, int y)/*取x行第y个字符*/
{
return GetArray(pThis, x)[y];
}
__inline void SetCharVal(mysqlAdo *pThis, int x, int y, char cVal)
{
GetArray(pThis, x)[y] = cVal;
}
/*测试代码*/
int main(int argc, char* argv[])
{
int nCol = 50, nRow = 5;
int i, j;
mysqlAdo *pSqlAdo = (mysqlAdo *)malloc(sizeof(mysqlAdo)+nRow*nCol*sizeof(char));/*这里多分配了一点的内存,可以减出来*/
/*数据全部初始化为字符'#'*/
memset(pSqlAdo->pData, '#', nRow*nCol*sizeof(char));
pSqlAdo->nFlag = 0;
pSqlAdo->nRow = nRow;
pSqlAdo->nCol = nCol;
for(i=0; i
typedef struct mysqlAdo
{
int nFlag; /*操作结果标志,0:成功,其它表示失败*/
int nRow; /*结果集的行数*/
int nCol; /*结果集的列数*/
char pData[1]; /*存放结果集*/
}mysqlAdo;
#pragma pack()
__inline char * GetArray(mysqlAdo *pThis, int x)/*取第x行*/
{
return pThis->pData+pThis->nCol*x;
}
__inline char GetCharVal(mysqlAdo *pThis, int x, int y)/*取x行第y个字符*/
{
return GetArray(pThis, x)[y];
}
__inline void SetCharVal(mysqlAdo *pThis, int x, int y, char cVal)
{
GetArray(pThis, x)[y] = cVal;
}
/*测试代码*/
int main(int argc, char* argv[])
{
int nCol = 50, nRow = 5;
int i, j;
mysqlAdo *pSqlAdo = (mysqlAdo *)malloc(sizeof(mysqlAdo)+nRow*nCol*sizeof(char));/*这里多分配了一点的内存,可以减出来*/
/*数据全部初始化为字符'#'*/
memset(pSqlAdo->pData, '#', nRow*nCol*sizeof(char));
pSqlAdo->nFlag = 0;
pSqlAdo->nRow = nRow;
pSqlAdo->nCol = nCol;
for(i=0; i