以下是代码:
#include <stdio.h>
void test(const char* anagrams[])
{
while(*anagrams != NULL) {
printf("%s\n", *anagrams);
anagrams++;
}
}
int main()
{
char *arr[] = {"cat", "bat", "mate", "tac", "tab", "act", "tame", NULL};
printf("%lu\n", sizeof(arr));
test(arr);
}
此代码生成以下警告:
$ gcc const_char_star_star.c
const_char_star_star.c:16:8: warning: passing 'char *[8]' to parameter of type 'const char **' discards qualifiers in nested pointer types [-Wincompatible-pointer-types-discards-qualifiers]
test(arr);
^~~
const_char_star_star.c:3:23: note: passing argument to parameter 'anagrams' here
void test(const char* anagrams[])
^
生成1个警告。
如果我在参数中删除了const限定符,那么它将在没有任何警告的情况下进行编译。
答案 0 :(得分:3)
重复:
Double pointer const-correctness warnings in C
在C FAQ中回答:
http://c-faq.com/ansi/constmismatch.html
复制粘贴示例:
const char c = 'x'; /* 1 */
char *p1; /* 2 */
const char **p2 = &p1; /* 3 */
*p2 = &c; /* 4 */
*p1 = 'X'; /* 5 */
在第3行中,我们将char **分配给const char **。 (编译器应该抱怨。)在第4行中,我们将const char *赋给const char *;这显然是合法的。在第5行,我们修改了char *指向的内容 - 这应该是合法的。但是,p1最终指向c,即const。这是第4行,因为* p2真的是p1。这是在第3行设置的,这是一个不允许的表格的分配,这正是不允许第3行的原因。
答案 1 :(得分:1)
正如你自己指出的那样,这是一个限定词问题;
const char *arr[] = {"cat", "bat", "mate", "tac", "tab", "act", "tame", NULL};
在声明中添加const
也会使警告消失。
答案 2 :(得分:0)
关键字 const 表示无法更改变量所持有的值。 这里
char *arr[] = {"cat", "bat", "mate", "tac", "tab", "act", "tame", NULL};
test(arr);
并且函数 test 定义为
void test(const char* anagrams[])
表示指针指向的值无法更改,因此该函数无法更改数组的原始值。
编译器生成警告,因为在调用函数test(arr);
时没有指定数组' arr '是 const 二维数组,这会产生歧义因为main函数中使用的 char * 数组作为 const char * 传递给编译器,因此会生成您指定的警告。
Inoder避免警告将数组声明为
const char *arr[] = {"cat", "bat", "mate", "tac", "tab", "act", "tame", NULL};