通过C编译器警告,当一个char * ARR []对函数为const char ** ARR [英] c compiler warning when passing a char *arr[] to a function as const char **arr

查看:333
本文介绍了通过C编译器警告,当一个char * ARR []对函数为const char ** ARR的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是code:

#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);
}

这code生成下列警告:

This code generates the following warning:

$ GCC const_char_star_star.c

$ 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限定符在参数测试,它编译没有任何警告。

If I remove the const qualifier in the arguments for test, it compiles without any warning.

推荐答案

的复制:

<一个href=\"http://stackoverflow.com/questions/5055655/double-pointer-const-correctness-warnings-in-c\">Double用C 指针常量,正确性警告

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,这是常量。这是约在第4行,因为* P2真的P1。这个成立于3号线,这是不允许形式的转让,而这也正是为什么3号线是不允许的。

In line 3, we assign a char ** to a const char **. (The compiler should complain.) In line 4, we assign a const char * to a const char *; this is clearly legal. In line 5, we modify what a char * points to--this is supposed to be legal. However, p1 ends up pointing to c, which is const. This came about in line 4, because *p2 was really p1. This was set up in line 3, which is an assignment of a form that is disallowed, and this is exactly why line 3 is disallowed.

这篇关于通过C编译器警告,当一个char * ARR []对函数为const char ** ARR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆