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