通过C编译器警告,当一个char * ARR []对函数为const char ** ARR [英] c compiler warning when passing a char *arr[] to a function as 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屋!