首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用C语言将指向结构的指针传递给函数?

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

Stack Overflow用户
提问于 2013-06-04 13:29:18
回答 3查看 595关注 0票数 3

我刚开始和c一起发展,当然总有一天我需要你的帮助。我想这一次是:)

我想要做的是:我在C中尝试使用MySQL Api,因为我想使用一个结构来保存我的SQLQuery和它的所有参数,例如用于选择或插入的用户数据。

然后,通过一些函数,我想添加、删除和编译字符串,以便在查询中使用它。

为了使用我的createSqlQuery函数,我想向它传递一个对SQLQuery结构的引用,并在函数中修改它。在该函数结束后,它不应该超出范围,仍然可以在主函数中使用。

那是我现在被塞的地方。我想我的问题很简单,但是经过几个小时的观察和尝试之后,我有点盲目地想找到解决方案。使用这个问题:Passing pointers/references to structs into functions,我终于有了一个工作代码,在创建函数结束后,这个结构仍然可以使用。

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

错误信息:

main.c:127:10:错误:在非结构或联合中请求成员‘addParam’

在create函数中添加第二个*以获得指向指针的指针(请参见其他堆栈溢出问题)后,就发生了这种情况。

到目前为止,这就是我所拥有的:

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
(sqlQuery *)*query->queryS = queryString;

与**,或&.

我希望你能明白我的苦衷,我想这很简单,但我似乎真的想不出:)

提前感谢!

EN

回答 3

Stack Overflow用户

发布于 2013-06-04 13:35:32

为了更简单,请尝试

代码语言:javascript
复制
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;
}

否则,您想使用语法的方法是:

代码语言:javascript
复制
    (*ptrresultquery)->queryS= queryString;
票数 0
EN

Stack Overflow用户

发布于 2013-06-04 13:35:38

最好让您的createSqlQuery()函数返回新创建的查询,这样在实际代码中使用起来就容易多了。

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

代码语言:javascript
复制
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;
}

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

票数 0
EN

Stack Overflow用户

发布于 2013-06-04 13:37:22

(*query)->queryS = queryString;将做这项工作

如果在main之后调用函数,则使用原型。

代码语言:javascript
复制
bool createSqlQuery(sqlQuery **query, char *queryString);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16919206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档