最近我在理解 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/