gpt4 book ai didi

c++ - c/c++ 中的指针到字符数组赋值

转载 作者:太空宇宙 更新时间:2023-11-04 15:01:27 27 4
gpt4 key购买 nike

过去我一直在使用 Visual Studio 2010/2013/2015 并且这种语法是可能的:

char* szString = "This works!";

我已经决定开始并改变我的编码生活方式,转向 Linux,因为我已经安装了 g++ 并将 SlickEdit 作为我的 IDE。

这句话好像已经不行了。谁能说说为什么?

但这有效:

char strString[] = "This works!";

错误与 c++11 有关。

有人知道为什么会这样吗?不是如何修复它,因为在我的工作区中没有任何方法可以安装 c++11 编译器,我只是好奇它是否与编译器工作原理的背景有关。关于第一行代码,我所知道的是,它在堆栈上创建了一个常量变量,并创建了一个新的指针,将自身设置为指向该 ESP 的值,但在第二行中,它计算了常量变量上的字母数量,然后结果在最后设置一个空终止符。

哦还有一件事 -> 第一个在 GCC/GPP 中设置的方式似乎也有所不同,因为第一个类型是 {char*&} 而第二个是 {char(*) [12]},对此有什么解释吗?谢谢!

最佳答案

当您编写文字 "text" 时,该文本将包含在已编译程序图像的某处。出于安全原因,程序镜像通常放在现代操作系统的写保护内存中。

char* someString = "text"; 声明一个指向您可能写保护的程序镜像中的字符串的指针。将此指针声明为非常量的能力是 C++11 之前包含的一项功能,以保持与 C 的源代码兼容性。请注意,即使 someString 不是指向常量的指针,任何尝试修改它指向的值仍然会导致未定义的行为。 C++11 中删除了此向后兼容性功能。 someString 现在必须声明为指向常量的指针:const char* someString = "text";。您可以放弃 const,但尝试写入指向的值仍然会导致未定义的行为,这与您强制转换为非常量的任何 const 值相同。

char someString[] = "text"; 的工作方式不同。这会将字符串 "text" 从程序的代码内存复制到位于数据内存中的数组中。它类似于

char someString[5];
strcpy(someString, "text");

因为 someString 是程序数据内存中的一个数组,所以可以写入它,而且它不需要是 const 限定的。

关于c++ - c/c++ 中的指针到字符数组赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38294292/

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