我很惊讶这个编译没有任何警告:
int main()
{
*"abc" = '\0';
}
gcc main.c -Wall -Wextra
和clang main.c -Weverything
。
为什么没有这个警告?有什么办法可以解决分段错误吗?
答案 0 :(得分:4)
您可以使用-Wwrite-strings
在GCC中获取此代码的警告。来自GCC documentation:
-Wwrite串
编译C时,给字符串常量类型const char [length],这样将一个地址复制到一个非const char *指针就会收到警告。这些警告将帮助您在编译时找到可以尝试写入字符串常量的代码,但前提是您在声明和原型中使用const非常小心。否则,这只会令人讨厌。这就是为什么我们没有让-Wall请求这些警告。
编译C ++时,警告有关从字符串文字到char *的弃用转换。对于C ++程序,默认情况下会启用此警告。
“有什么办法不能引起分段错误?” - >修改字符串litteral是未定义的行为。所以任何事情都可能发生,包括不分裂。