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)
问题是什么?
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)
同样地.
如上所述,大多数情况下,它可能不值得.
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |