#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
而没有警告。当将
const char
传递给在print(constArray);
中接收一个char
的函数时,换句话说,将const char
强制转换为char
,编译器确实会给出警告。我原本期望编译器在两种情况下都会给出警告,或者两种情况下都不会,但其中一种情况没有警告。我认为这个警告非常重要,可以帮助防止像
array[0][0] = '!';
这样的错误。那么为什么我在第一个初始化时没有得到警告呢?
const char *
的值不能赋给类型为char *
的lvalue——这违反了标准的第6.5.16/1段。这里的问题部分在于“只读”是字符串字面量的一个糟糕描述,并且它与const
并不等价。标准并没有说字符串字面量是只读的;它说尝试修改它们的值会产生未定义的行为。这是一个微妙但重要的区别。 - John Bollinger