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

Dan*_*iel 3 c pointers function-pointers function

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

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

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

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

那是我目前被困的地方.我想我的问题非常简单,但在看了几个小时之后,我有点盲目看到解决方案.使用这个问题:将指向结构的指针/引用传递给函数我终于发生了一个工作代码,结果在create Function结束后结构仍然可用.

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

错误信息:

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;
}
Run Code Online (Sandbox Code Playgroud)

我也试过组合和变化:

(sqlQuery *)*query->queryS = queryString;
Run Code Online (Sandbox Code Playgroud)

与**,或&...

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

提前致谢!

hmj*_*mjd 5

这是由运算符优先级引起的,因为成员访问运算符的->优先级高于解除引用运算符*.更改:

*query->queryS = queryString; 
Run Code Online (Sandbox Code Playgroud)

至:

(*query)->queryS = queryString;
Run Code Online (Sandbox Code Playgroud)

其他:

  • 不要转换返回值malloc().
  • 代码将字符串文字的地址(只读)分配给a char*.使用const char*或复制字符串(使用malloc()/ strcpy()strdup()如果您的实现提供它.
  • 记住free()什么是malloc()d.