[英]Why do I get a warning trying to pass a 'char (*c)[6]' to a function expecting a 'const char (*c)[6]'?
我知道char **
与const char **
事情(如c faq 中所述),但我看不到任何使用指向数组的指针这样做会导致数组本身内部的某些内容被实际修改的情况。
我的代码:
void fun(const char (*p)[6])
{
printf("%s", p[0]);
}
int main(int argc, char *argv[])
{
char a[6] = "hello";
char (*c)[6];
c = &a;
fun(c);
}
使用 gcc 编译时给出以下输出:
test.c:17:9: warning: passing argument 1 of 'fun' from incompatible pointer type
test.c:5:10: note: expected 'const char (*)[6]' but argument is of type 'char (*)[6]'
这里的问题在某种程度上是相关的,但到目前为止还没有答案。 是否只是编译器偏执,摆脱警告的唯一方法是显式强制转换? 或者真的有可能出错吗?
标准的第 6.5.16.1 (1) 节涵盖了常量转换:
- 两个操作数都是指向兼容类型的限定或非限定版本的指针,左侧指向的类型具有右侧指向的类型的所有限定符;
在这种情况下,看起来T
是char [6]
并且其余要求显然成立,通过修改您的示例可以看出:
int main(int argc, char *argv[])
{
typedef char c6[6];
c6 a = "hello";
const c6 *p = &a;
}
然而事实并非如此! 这与 6.7.3 (8) 相交:
如果数组类型的规范包含任何类型限定符,则元素类型如此限定,而不是数组类型。
所以const c6 *
实际上将类型命名为const char (*)[6]
; 也就是说,指向 const char 的 array[6] 的指针,而不是指向char 的const array[6] 的指针。
然后 LHS 指向类型const char[6]
,RHS 指向类型char[6]
,它们不是兼容类型,简单赋值的要求不成立。
这只是 C 语言规范的一个怪癖。 再比如,从 const 正确性的角度来看, char **
到const char *const *
转换也是安全的,但在 C 中是被禁止的。
这种 const 正确性规则的怪癖在 C++ 语言中是“固定的”,但 C 在这方面继续坚持其原始规范。
实际上原因非常相似(char ** vs. 数组指针)。
对于您正在尝试做的事情,以下内容就足够了(并且有效):
void fun(const char *p)
{
printf("%s", p);
}
int main(int argc, char *argv[])
{
char a[6] = "hello";
char *c;
c = a;
fun(c);
}
根据您正在尝试执行的操作,可以按如下方式修改值以达到目的(只是一个示例):
void morefun(const char *p[6])
{
char d;
char *p1 = &d;
p[1] = p1;
*p1 = 'X';
printf("\nThe char is %c\n", *p[1]);
}
int main(int argc, char *argv[])
{
const char *d[6];
morefun(d);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.