c++ - 为什么我的 char* 在 C++ 中是可写的,有时是只读的

标签 c++ cstring access-violation

最近我在理解 char* 时遇到了很大的问题。 假设我创建了一个递归函数来恢复 char* 但是根据我初始化它的方式我遇到了一些访问冲突,并且在我的 C++ primer 中我没有找到任何让我理解的正确路径所以我正在寻求你的帮助。

案例 1 我在尝试交换字母时遇到访问冲突的第一个案例:

char * bob = "hello";

CASE 2 然后我试着让它工作

char * bob = new char[5];
bob[0] = 'h';
bob[1] = 'e';
bob[2] = 'l';
bob[3] = 'l';
bob[4] = 'o';

案例 3 但是当我进行 cout 时,我在最后得到了一些随机的废话,所以我将其更改为

char * bob = new char[6];
bob[0] = 'h';
bob[1] = 'e';
bob[2] = 'l';
bob[3] = 'l';
bob[4] = 'o';
bob[5] = '\0';

案例 4 这行得通,所以我告诉自己为什么这行不通

 char * bob = new char[6];
 bob = "hello\0";

CASE 5 它失败了,我也在某处读到你可以做类似的事情

char* bob[];

然后添加一些东西。 我的问题是为什么有些会失败而有些不会,最好的方法是什么?

最佳答案

关键是其中一些指针指向分配的内存(可读/写),其中一些指针指向字符串常量。字符串常量存储在与分配的内存不同的位置,并且不能更改。好吧,大多数时候。系统中的漏洞通常是代码或常量被更改的结果,但这是另一回事。

无论如何,关键是使用new关键字,这是在读/写内存中分配空间,因此您可以更改该内存。

这个说法是错误的

char * bob = new char[6];
bob = "hello\0";

因为您正在更改指针而不是复制数据。你想要的是这个:

char * bob = new char[6];
strcpy(bob,"hello");

strncpy(bob,"hello",6);

此处不需要 nul,因为字符串常量 "hello" 将由编译器放置 null。

关于c++ - 为什么我的 char* 在 C++ 中是可写的,有时是只读的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2241834/

相关文章:

c - 为什么我的变量值会随机变化?

c++ - 写入时 WaitForMultipleObjects 访问冲突

c++ - 编写自定义用户操作时如何引用内置操作

c++ - 移动选择的构造函数而不是复制。 [引用标准]

c - 多字符串连接

c++ - 将对象传递给 var arg 函数

swift - 在 Swift 中将字符串转换为 UnsafeMutablePointer<char_t>

c++ - new int[] 抛出 'Access Violation' 异常

c++ - 我不明白 DoNotOptimizeAway 的定义

c++ - 如何在 Eclipse 4.7.3a 中抑制 "Syntax error"