【发布时间】:2014-09-03 02:36:20
【问题描述】:
代码如下:
#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 限定符,它会在没有任何警告的情况下编译。
【问题讨论】:
-
附带说明:将函数参数用作这样的变量并不是一个好习惯,如果函数更复杂,可能会更难理解。最好声明一个复制参数并保持原始不变的局部变量。无论如何优化都会在后台为您解决它。
-
printf("%zu\n", sizeof(arr));:将"%zu"用于sizeof或(size_t)。