警告:参数与原型(C)|不兼容char [] V.S的地址字符**

时间:2012-02-15 21:22:21

标签: c

我有一个char数组。我将其地址传递给一个接受双字符指针的函数:

char result[1024+1];
memset(result, 0, sizeof(result));
executeGetQuery(query, &(result));

功能定义:int executeGetQuery(char * query, char ** queryResultData)

我收到此编译时错误

  

警告:参数#2与原型不兼容:
  prototype:指向char的指针:第1531行   参数:指向char

的数组[1025]的指针

我以前总是将数组作为指针传递给C。为什么我收到此错误?我的编译器应该受到责备吗?

编辑:修复是什么?
EDIT2:我希望函数能够向结果数组写一些东西,这就是我传递char **而不是char *的原因。那么,让函数写入我传入的参数的另一种方式是什么?

5 个答案:

答案 0 :(得分:3)

char**这意味着该功能将写入到指定的内存位置,例如:

int executeGetQuery(char * query, char ** queryResultData) {
    char* buffer = malloc( ... );
    /* get the query results into buffer */
    *queryResultData = buffer;
    ...
}

你不能用数组做,它的地址是不可写的。

答案 1 :(得分:2)

  

修复是什么?

在这种情况下(您不需要char **)在原型和调用代码中都使用char *

int executeGetQuery(char *query, char *queryResultData);
executeGetQuery(query, result);

我还要包含一个用于防止缓冲区溢出的大小参数

int executeGetQuery(char *query, char *queryResultData, size_t len);
executeGetQuery(query, result, sizeof result);

修改

更改数组的内容,例如

int executeGetQuery(char *query, char *queryResultData, size_t len) {
    queryResultData[0] = 'H';  /* changing */
    queryResultData[1] = 'i';  /* the contents */
    queryResultData[2] = '\0'; /* of the array */
}

您可以看到调用函数的更改

executeGetQuery(NULL, result, sizeof result);
printf("result is now %s\n", result); /* should print "Hi" */

答案 2 :(得分:1)

&result不是char **类型。它的类型为char (*)[1025]

您必须将指针传递给指向您函数的char的指针:

char *p;
executeGetQuery(query, &p);

答案 3 :(得分:1)

我不确定我能解释这个100%是可以理解的,但编译器是正确的。 char**是指向存储char指针的内存位置的指针。

您没有传入存储指针的内存位置,而是尝试传入char数组的地址。您可以手动将char数组分配给char指针变量并使用该变量的地址,但编译器不会自动为您创建该临时变量。

答案 4 :(得分:1)

该函数可能需要char**,因为它将为您分配结果缓冲区,并使用返回值来指示错误。因此,它将通过修改您提供的char指针来返回缓冲区。要做到这一点,它需要访问其内存位置。这就是函数采用char**的原因。因此,要正确使用它,您需要执行以下操作:

char *foo;
executeGetQuery(query, &foo); // foo now points to the result buffer

虽然您可以在某些上下文中使用数组,但在C中需要指针,但它们并不相同。您的示例使您很容易理解为什么:result已经是一个已分配的内存区域(最有可能在堆栈上,如果它是一个局部变量),所以它可以衰减成指向其第一个元素的指针,但它不能是一个左手,就像指针一样。