[英]In C, how to fix this warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[100]
[英]warning: argument is incompatible with prototype (C) | address of char [] V.S. char**
我有一个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 *的原因。 那么,让函数写入我传入的参数的另一种方式是什么?
char**
这里表示函数将写入给定的内存位置,如:
int executeGetQuery(char * query, char ** queryResultData) {
char* buffer = malloc( ... );
/* get the query results into buffer */
*queryResultData = buffer;
...
}
你不能用数组做,它的地址是不可写的。
修复是什么?
在这种情况下(您不需要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" */
&result
不是char **
类型。 它的类型为char (*)[1025]
。
你必须将指向char
的指针传递给你的函数:
char *p;
executeGetQuery(query, &p);
我不确定我能解释这100%是可以理解的,但编译器是正确的。 char**
是指向存储char指针的内存位置的指针。
您没有传入存储指针的内存位置,而是尝试传入char数组的地址。 您可以手动将char数组分配给char指针变量并使用该变量的地址,但编译器不会自动为您创建该临时变量。
该函数可能需要一个char**
因为它将为您分配结果缓冲区并使用返回值来指示错误,例如。 因此,它将通过修改您提供的char
-pointer来返回缓冲区。 要做到这一点,它需要访问其内存位置。 这就是函数采用char**
。 所以要正确使用它,你需要做:
char *foo;
executeGetQuery(query, &foo); // foo now points to the result buffer
虽然您可以在某些上下文中使用数组,但在C中需要指针,但它们并不相同。 你的例子让人很容易理解为什么: result
已经是一个已分配的内存区域(最有可能在堆栈上,如果它是局部变量),所以它可以衰减成指向其第一个元素的指针,但它不能是左值,像一个指针可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.