如何使用C语言将结构指针传递给函数?

时间:2013-06-04 13:29:18

标签: c function pointers function-pointers

我是c的新手。果然有一天我需要你的帮助。我想这次现在是:)

我想做什么: 我正在使用C中的MySQL Api进行实验。因为我想使用一个结构来保存我的SQLQuery以及所有它的参数,例如用户数据供选择或插入。

然后使用我要添加的几个函数,删除并编译字符串以在查询中使用它。

要使用我的createSqlQuery函数,我想将对SQLQuery Structure的引用传递给它,并在函数中更改它。在函数结束后,它不应超出范围,仍然可以在main函数中使用。

这就是我目前被困的地方。我想我的问题非常简单,但在看了几个小时之后,我有点盲目看到解决方案。 使用这个问题:Passing pointers/references to structs into functions我终于发现了一个有效的代码,结构在创建函数结束后仍然可用。

但由于某种原因,我无法进一步编译我的代码,因为它无法为我的结构分配一些东西。

错误讯息:

  

main.c:127:10:错误:请求成员'addParam'不是结构或联合

在create函数中添加第二个*以获取指针指针后发生这种情况(参见其他stackoverflow问题)。

这是我到目前为止所做的:

typedef struct sqlQuery sqlQuery;

struct sqlQuery{
    char *queryS;
    char **params; //array of array of chars to hold the params to replace %? in the query
    bool (*addParam)(sqlQuery*, char*);
    bool (*compile)(sqlQuery*);
};

int main(){
/* ...  */
    sqlQuery *testQuery = NULL;
    printf("%p\n", &testQuery);
    printf("%p\n", testQuery);
    createSqlQuery(&testQuery,"SELECT * FROM test WHERE name = '%?'");
    printf("%p\n", testQuery);
    if (testQuery != NULL) printf("working, testQuery still assigned");
    //testQuery->addParam(testQuery, "test");
    //freeSqlQuery(testQuery);

    exit(EXIT_SUCCESS);
}

bool createSqlQuery(sqlQuery **query, char *queryString){
    *query = (struct sqlQuery *) malloc(sizeof(struct sqlQuery));  //get heapspace for sqlQuery Struct
    printf("%p\n", *query);
    //query->addParam = __sqlQueryAddParam;      //link param function pointer
    //query->compile = __compileSqlQuery;        //link compile function pointer
    *query->queryS = queryString;               //save pointer to query String
    //^^^ this is where the error occurs

    return true;
}

我还尝试了以下组合和变体:

(sqlQuery *)*query->queryS = queryString;

**,或& ...

我希望你得到我正在努力的东西,我想这很简单,但我似乎无法弄明白:)

提前致谢!

4 个答案:

答案 0 :(得分:5)

这是由operator precedence引起的,因为成员访问运算符->的优先级高于取消引用运算符*。变化:

*query->queryS = queryString; 

为:

(*query)->queryS = queryString;

其他:

  • 请勿从malloc()投射返回值。
  • 代码将字符串文字的地址(只读)分配给char*。如果您的实施提供,请使用const char*或复制字符串(使用malloc() / strcpy()strdup()
  • 请记住free() malloc() d。

答案 1 :(得分:0)

为了更简单,请尝试

bool createSqlQuery(struct sqlQuery **ptrresultquery, char *queryString)
{
    struct sqlQuery *query = (struct sqlQuery *) malloc(sizeof(struct sqlQuery));  //get heapspace for sqlQuery Struct

     query->addParam = __sqlQueryAddParam;      //link param function pointer
     query->compile = __compileSqlQuery;        //link compile function pointer
     query->queryS = queryString;               //save pointer to query String

     // write the local pointer back via parameter ptr
     *ptrresultquery= query;

     return true;
}

否则,您要对语法做什么

    (*ptrresultquery)->queryS= queryString;

答案 2 :(得分:0)

最好让createSqlQuery()函数返回新创建的查询,这样可以更容易地在实际代码中使用。

但是,如果你坚持返回布尔值并接受指向指针的指针,那么在函数内部使用临时指针会更容易:

bool createSqlQuery(sqlQuery **query, char *queryString){
  struct sqlQuery *q = malloc(sizeof *q);
  if( q != NULL ) {
    q->addParam = __sqlQueryAddParam;
    q->compile = __compileSqlQuery;        //link compile function pointer
    q->queryS = queryString;
    *query = q;
  }
  return q != NULL;
}

另外,请确保字符串的内存处理,并避免以两个下划线开头的符号。

答案 3 :(得分:0)

(*query)->queryS = queryString;将完成工作

如果在主

之后调用函数,则使用原型
bool createSqlQuery(sqlQuery **query, char *queryString);