C - 通过引用传递具有已知大小的多维数组

时间:2009-02-09 17:37:54

标签: c arrays reference multidimensional-array

主要:

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 )
{

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

感谢。

2 个答案:

答案 0 :(得分: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*/
}

如果您只是想要访问数据( myData tableData >,则可以这样调用 newCallBack() [R ):

/*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);

答案 1 :(得分:3)

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

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