![](/img/trans.png)
[英]Why is does char from an array give subscript warning in gcc for isspace in newlib
[英]Why gcc does not give a warning when you initialize an array without const with strings?
#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};
得到警告char *array[] = {"Hello", "World", NULL};
因为这些字符串的字符是只读的,但是编译器没有为此警告我。 因此,基本上,编译器让我在没有警告的情况下将const char
转换为char
a。
当通过一个const char
到其接收的功能char
在print(constArray);
,换句话说,将const char
“ cast”到char
编译器确实会警告我。 我期望编译器在两种情况下都不会给我警告,但在任何一种情况下都不会给我警告,而在另一种情况下则不会给我警告。
我认为此警告很重要,有助于防止出现array[0][0] = '!';
。 那么,为什么在第一次初始化时没有收到警告?
那么,为什么在第一次初始化时没有收到警告?
由于字符串文字的类型是char
数组,而不是const char
数组,尽管修改此类数组的元素会产生未定义的行为。 这是从C的第一天开始的,当时没有const
。 我确信它对现代C语言的持久性围绕着类型更改会引起的不兼容的程度和范围。
但是,对于个别程序,GCC可以为您提供帮助。 如果您打开它的-Wwrite-strings
选项,那么它的确会给出类型为const char [
length
]
字符串文字,其结果是,您所提出的结构将引发警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.