繁体   English   中英

当初始化不带字符串的const数组时,为什么gcc不会发出警告?

[英]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到其接收的功能charprint(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM