gpt4 book ai didi

c++ - 在 VS 中更改常量 char* 文字的元素

转载 作者:太空狗 更新时间:2023-10-29 20:53:56 32 4
gpt4 key购买 nike

这是代码:

int main()  
{
char* a = "abc"; // Should be 'const char*', but no warnings whatsoever on VS
a[1] = 'e'; // No warnings on VS either

std::cout<< a << " " << a[1];

return 0;
}



使用 gcc 版本 6.2.0 编译:

>g++ -O2 -o Test Test.cpp
Test.cpp: In function ‘int main()’:
Test.cpp:5:15: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
char* a = "abc";
^~~~~

>./Test
Segmentation fault (core dumped)



使用 VS 2015.3 编译:

>cl /EHsc /W4 /WX /O2 Main.cpp  
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

Main.cpp
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation. All rights reserved.

/out:Main.exe
Main.obj

>Main.exe  
abc e

HUH?^

在没有 /O2 的情况下编译也不会产生警告,但会在运行时崩溃。


这是 VS 编译器错误还是我遗漏了什么?

最佳答案

我认为这不能称为错误。使用 a[1] = 'e'; 您正在更改只读存储器。不应修改字符串文字。这实际上是一种未定义的行为。为什么 VS 编译器没有像 gcc 那样发出警告?好吧,每个程序(编译器也是一个程序)都可以更好。在这种特殊情况下,非常旧的编译器代码可以工作,因为这不是最近的 C++ 功能(如 T&& 引用)。旧代码可能不会给出最佳错误。

还有很多其他方法可以编写糟糕的代码。不幸的是,在 C/C++ 中,这相对容易。我们到了。

有许多静态代码检查器和 sanitizer (例如:CodeSonar)。通常它们不是免费的。他们发现了很多问题,但不是所有问题。

关于c++ - 在 VS 中更改常量 char* 文字的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40833635/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com