将char * arr []传递给const char ** arr的函数时的c编译器警告

时间:2014-07-12 16:48:47

标签: c pointers char const

以下是代码:

#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限定符,那么它将在没有任何警告的情况下进行编译。

3 个答案:

答案 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};