为什么gcc在没有带字符串的const的情况下初始化数组时不会发出警告?

时间:2016-10-09 22:54:41

标签: c gcc casting const warnings

#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] = '!';中的错误非常重要。那么为什么我在第一次初始化时没有收到警告?

2 个答案:

答案 0 :(得分:4)

  

那么为什么我在第一次初始化时没有收到警告?

因为字符串文字的类型是char的数组,而不是const char的数组,尽管修改这样的数组的元素会产生不确定的行为。这是从C的最初几天开始的,当时没有const。我确信它对现代C的持久性围绕着类型改变时会出现的不兼容性的大小和范围。

但是,对于个别项目,GCC可以帮助您。如果你打开它的-Wwrite-strings选项,它确实会给字符串文字输入const char [ length ],结果是一个构造如你提出的将引发警告。

答案 1 :(得分:1)