3

主要:

char *myData[500][9]; //dynamic rows??
char **tableData[500]={NULL};         //dynamic rows??
int r;

newCallBack(db, &myData, &tableData, &r);

并通过以下方式传递给函数:

void newCallBack(sqlite3 *db, char** mdat, char*** tdat, int* r )
{

好像不喜欢这个?有什么建议么?当你不知道尺寸时,网上有很多例子,现在就试试吧......

谢谢。

4

2 回答 2

4

如果您要这样重写:

#define NUM_ROWS 500;
#define NUM_COLS 9;

char **myData  = NULL;
char  *tableData = NULL;
int    i;
int    r;

myData = malloc(sizeof(char *) * NUM_ROWS);
if (!myData)
    return; /*bad return from malloc*/

tableData = malloc(sizeof(char) * NUM_ROWS);
if (!tableData)
    return; /*bad return from malloc*/

for (i = 0; i < NUM_ROWS; i++)
{
    myData[i] = malloc(sizeof(char) * NUM_COLS);
    if (!myData[i])
        return;  /*bad return from malloc*/
}

如果您只想访问数据(myDatatableDatar ),您可以像这样调用newCallBack( ) :

/*prototype*/
void newCallBack(sqlite3 *db, char** mdat, char* tdat, int r);

/*call*/
newCallBack(db, myData, tableData, r);

或者,如果您希望能够修改变量myData 和 tableData指向的内容以及r的值:

/*prototype*/
void newCallBack(sqlite3 *db, char ***mdat, char **tdat, int *r);

/*call*/
newCallBack(db, &myData, &tableData, &r);
于 2009-02-09T18:29:12.607 回答
3

首先,myData 的问题在于它的类型错误。char* [][] 在您调用的函数中需要一个原型 char***(字符串的二维数组)。如果您不介意限制字符串的大小,该函数需要一个字符串列表,即 char* [] 或 char[][]。

要获得完全动态的数组大小,您必须使用 malloc() 和 free() 手动分配(并释放!)内存,并将变量的类型更改为 char **myData 和 char ***tableData。

于 2009-02-09T17:43:50.813 回答