【发布时间】:2012-06-27 15:26:52
【问题描述】:
我知道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]'
here 的问题在某种程度上是相关的,但到目前为止还没有答案。是否只是编译器偏执,摆脱警告的唯一方法是显式强制转换?还是真的有可能出问题?
【问题讨论】:
-
很有趣,我没有收到任何警告。你用什么标志编译?编辑:clang 似乎足够聪明,不会对此发出警告,但 GCC 仍然如此。奇数。
-
@OliCharlesworth:是的,看起来确实是相同的理由。所以我想我很适合铸造..
-
为什么相同的理由?这两个问题对我来说似乎非常不同(@Oli 可能会将您的评论格式化为答案,如果只是为了我)。
-
@anatolyg:正如 Oli 所说,基本原理是一样的。这个理由是,“C 标准未能定义一些 const 安全的隐式指针转换,因此在 C++ 中定义”。问题是不同的,但它们的形式都是“为什么我不能将指针类型 X 隐式转换为更恒定的类型 Y,即使这样做是 const 安全的”。只有 X 和 Y 不同,答案是相同的,相当于“因为 C 标准不会费心弄清楚什么是 const-safe 并启用它”。
标签: c arrays pointers parameters constants