3

我是使用 c 开发的新手。果然有一天我需要你的帮助。我想现在是现在:)

我正在尝试做的事情:我正在用 C 语言试验 MySQL Api。为此,我想使用一个结构来保存我的 SQLQuery 及其所有参数,例如用于选择或插入的用户数据。

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

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

那就是我目前被困的地方。我想我的问题很简单,但是在看了几个小时并尝试了它之后,我有点盲目地看不到解决方案。使用这个问题:将结构的指针/引用传递给函数我终于碰巧有一个工作代码,该结构在创建函数结束后仍然可用。

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

错误信息:

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

这发生在在创建函数中添加第二个 * 以获取指向指针的指针之后(请参阅其他 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

4 回答 4

5

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

*query->queryS = queryString; 

至:

(*query)->queryS = queryString;

其他:

  • 不要从malloc().
  • 该代码将只读字符串文字的地址分配给char*. 使用const char*或复制字符串(使用malloc()/strcpy()strdup()如果您的实现提供了它。
  • 记住free()什么是malloc()d。
于 2013-06-04T13:34:38.093 回答
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;
于 2013-06-04T13:35:32.270 回答
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;
}

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

于 2013-06-04T13:35:38.490 回答
0

(*query)->queryS = queryString;会做的工作

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

bool createSqlQuery(sqlQuery **query, char *queryString);
于 2013-06-04T13:37:22.467 回答