再问: 极具挑战性的问题:动态申请内存,再用来存储二维字符串数组

xbdvcx2 2005-08-21 01:32:23
用C写了一个操作MySql的程序,想将操作MySql后得到的数据写入到一个结构中去,以便以后处理,这个结构如下:
struct mysqlAdo
{
int nFlag; //操作结果标志,0:成功,其它表示失败
int nRow; //结果集的行数
int nCol; //结果集的列数
char pData[][]; //存放结果集
}
结果集是一个nRow行,nCol列的二维字符串数组,就是从数据库中查找到的数据,

那三个整形数据没有问题,就是最后一个,我的这个定义可能是错误的,意思就是这样的:用pData[0][1]就可以取出结

果集的第0行,第2列的数据,以此类推,我现在不知道怎样定义这个pData好一点,也不知道该怎样为其申请内存空间,再

怎样释放,因为这一切都是动态的,不知道结果集的总字节是多少,也不清楚怎样在分配的空间中划分成一个二维字符

串数组的样子,也不清楚如何将数据写入这个结构中,都愁死了,我的LINUX基础很不好,VC++倒还可以,但用纯C来完成

这个东东,真是没有思路,请大家帮忙了多谢.
...全文
127 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
daocaoren7654 2005-08-23
  • 打赏
  • 举报
回复
各位大哥,小弟菜鸟一名,以后有什么问题请大家帮帮忙教我哈子,我不甚感激啊!
我自己建了个QQ群:2869593,刚刚升为高级群!为大家以后交流提供一个地方,希望各位编程界的
哥哥姐姐们都来捧场,谢谢大家了!
yjf7888 2005-08-22
  • 打赏
  • 举报
回复
呜,上面的代码有问题,重载一下[]不知道能解决不
suiyun 2005-08-22
  • 打赏
  • 举报
回复
学习
wjlsmail 2005-08-22
  • 打赏
  • 举报
回复
Mark
sharkhuang 2005-08-22
  • 打赏
  • 举报
回复
struct mysqlAdo
{
int nFlag; //操作结果标志,0:成功,其它表示失败
int nRow; //结果集的行数
int nCol; //结果集的列数
char *pData; //存放结果集
}
yjf7888 2005-08-22
  • 打赏
  • 举报
回复
用c写的,那就这样改

#include <stdio.h>
#include <string.h>

#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)//取第n行
{
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, '#', sizeof(mysqlAdo)+nRow*nCol*sizeof(char));


pSqlAdo->nFlag = 0;
pSqlAdo->nRow = nRow;
pSqlAdo->nCol = nCol;


for(i=0; i<nRow; i++)
{
sprintf(GetArray(pSqlAdo, i), "This is Row%d", i);
}

puts("output1:");
for(i=0; i<nRow; i++)
{
printf("%s\n", GetArray(pSqlAdo, i));
}

puts("output2:");
for(i=0; i<nRow; i++)
{
for(j=0; j<nCol; j++)
{
printf("%c", GetCharVal(pSqlAdo, i,j));
SetCharVal(pSqlAdo, i,j, '!');
}
puts("");
}

puts("output3:");
for(i=0; i<nRow; i++)
{
for(j=0; j<nCol; j++)
{
printf("%c", GetCharVal(pSqlAdo, i,j));
}
puts("");
}

free(pSqlAdo);
return 0;
}
xbdvcx2 2005-08-22
  • 打赏
  • 举报
回复
to yjf7888(check check)
这样的话,每一个pData[0][0]只能存放一个字符了,我要的是在其中存放一个字符串
yjf7888 2005-08-22
  • 打赏
  • 举报
回复
#pragma pack(1)
struct mysqlAdo
{
int nFlag; //操作结果标志,0:成功,其它表示失败
int nRow; //结果集的行数
int nCol; //结果集的列数
char pData[1]; //存放结果集
char &GetData(int x, int y)
{
return pData[x*nCol+y];
}
};
#pragma pack()

struct mysqlAdo *pSqlAdo = (struct mysqlAdo *)malloc(sizeof(mysqlAdo)+nRow*nCol*sizeof(char));//这里多分配了一点的内存,可以减出来

pSqlAdo->nFlag = ...;
pSqlAdo->nRow = nRow;
pSqlAdo->nCol = nCol;
...
pSqlAdo->GetData(x, y) = ...;
...

free(pSqlAdo);
yjf7888 2005-08-21
  • 打赏
  • 举报
回复
#pragma pack(1)
struct mysqlAdo
{
int nFlag; //操作结果标志,0:成功,其它表示失败
int nRow; //结果集的行数
int nCol; //结果集的列数
char pData[1][1]; //存放结果集
};
#pragma pack()

struct mysqlAdo *pSqlAdo = (struct mysqlAdo *)malloc(sizeof(mysqlAdo)+nRow*nCol*sizeof(char));//这里多分配了一点的内存,可以减出来

pSqlAdo->nFlag = ...;
pSqlAdo->nRow = Row;
pSqlAdo->nCol = nCol;
...
pSqlAdo->pData[x][y] = ...;
...

free(pSqlAdo);
suiyun 2005-08-21
  • 打赏
  • 举报
回复
怎么在这里又见到这个东东

struct YOURSTRUCT (*p)[100][100];

p=(struct YOURSTRUCT(*)[][100])malloc(100*100*sizeof(struct YOURSTRUCT));

(*p)[0][0].field=1000;
ghtsao 2005-08-21
  • 打赏
  • 举报
回复
sql读写记录本来就缓存了,你再缓存一次是不是多此一举。

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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