为什么要警告实现指向字符串的指针数组?

LSG*_*LSG 1 c++ arrays gcc pointers string-literals

我试图使用指针实现一个字符串数组.以下是我的代码.

#include <stdio.h>
const int MAX = 4;
int main () {
char *names[] = {
  "abcd",
  "efgh",
  "ijkl",
  "mnop",
};
int i = 0;
for ( i = 0; i < MAX; i++) {
  printf("Value of names[%d] = %s\n", i, names[i] );
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在运行时发出警告.以下是警告:

C:\workspace>g++ test_pointer_string_arr.c -o tpsa.exe
test_pointer_string_arr.c: In function 'int main()':
test_pointer_string_arr.c:12:4: warning: deprecated conversion from string       const
ant to 'char*' [-Wwrite-strings]
};
^
test_pointer_string_arr.c:12:4: warning: deprecated conversion from string const
ant to 'char*' [-Wwrite-strings]
test_pointer_string_arr.c:12:4: warning: deprecated conversion from string const
ant to 'char*' [-Wwrite-strings]
test_pointer_string_arr.c:12:4: warning: deprecated conversion from string const
ant to 'char*' [-Wwrite-strings]
Run Code Online (Sandbox Code Playgroud)

问题是什么?

Sou*_*osh 5

C中的字符串文字是不可变的.任何更改字符串文字内容的尝试都会调用未定义的行为.

根据定义,串有型char [],所以,通过分配一个字符串文字char *停止从编写默默调用UB代码你.

关于gcc选项, -Wwrite-strings

-Wwrite-strings

在编译C时,为字符串常量提供类型,const char[length]以便将一个地址复制到非const char *指针中会产生警告.这些警告可以帮助您在编译时找到可以尝试写入字符串常量的代码,但前提是您在声明和原型中使用const非常小心.否则,这只会​​令人讨厌.这就是为什么我们没有-Wall提出这些警告的要求.

所以,你需要写

 const char *names[] = {
  "abcd",
  "efgh",
  "ijkl",
  "mnop",
 };
Run Code Online (Sandbox Code Playgroud)

同样地.

如上所述,大多数情况下,它可能不值得.