繁体   English   中英

警告:参数与原型(C)|不兼容 char [] VS char **的地址

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM