我有一个char数组。我将其地址传递给一个接受双字符指针的函数:
char result[1024+1];
memset(result, 0, sizeof(result));
executeGetQuery(query, &(result));
功能定义:int executeGetQuery(char * query, char ** queryResultData)
我收到此编译时错误
警告:参数#2与原型不兼容:
的数组[1025]的指针
prototype:指向char的指针:第1531行 参数:指向char
我以前总是将数组作为指针传递给C。为什么我收到此错误?我的编译器应该受到责备吗?
编辑:修复是什么?
EDIT2:我希望函数能够向结果数组写一些东西,这就是我传递char **而不是char *的原因。那么,让函数写入我传入的参数的另一种方式是什么?
答案 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
已经是一个已分配的内存区域(最有可能在堆栈上,如果它是一个局部变量),所以它可以衰减成指向其第一个元素的指针,但它不能是一个左手,就像指针一样。