#include <stdio.h>
void print(char *strings[]) {
while (*strings) printf("%s\n", *strings++);
}
int main(int argc, char *argv[]) {
char *array[] = {"Hello", "World", NULL}; // No warning?
const char *constArray[] = {"Hello", "World", NULL};
print(constArray); // Warning!
//constArray[0][0] = '!'; Compile time error
array[0][0] = '!'; // Run time error
return 0;
}
我希望在char *array[] = {"Hello", "World", NULL};
中收到警告,因为这些字符串的字符是只读的,但编译器没有给我一个警告。所以基本上编译器让我在没有警告的情况下将const char
“投射”到char
a。
将const char
传递给在char
中接收print(constArray);
的函数时,换句话说,将const char
“投射”到char
编译器确实给了我一个警告。我期待编译器在两种情况下或两者都没有给出警告,但不是在一种情况下而不是另一种情况。
我认为此警告对于帮助防止array[0][0] = '!';
中的错误非常重要。那么为什么我在第一次初始化时没有收到警告?
答案 0 :(得分:4)
那么为什么我在第一次初始化时没有收到警告?
因为字符串文字的类型是char
的数组,而不是const char
的数组,尽管修改这样的数组的元素会产生不确定的行为。这是从C的最初几天开始的,当时没有const
。我确信它对现代C的持久性围绕着类型改变时会出现的不兼容性的大小和范围。
但是,对于个别项目,GCC可以帮助您。如果你打开它的-Wwrite-strings
选项,它确实会给字符串文字输入const char [
length
]
,结果是一个构造如你提出的将引发警告。
答案 1 :(得分:1)