3

我最近遇到了很大的问题char*。假设我创建了一个递归函数来恢复 achar*但取决于我如何初始化它,我会遇到一些访问冲突,并且在我的 C++ 入门中我没有找到任何可以让我理解正确路径的东西,所以我正在寻求你的帮助。

案例 1 尝试交换字母时遇到访问冲突的第一种情况:

char * bob = "hello";

案例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";

案例 5,但它失败了,我还在某处读过你可以做类似的事情

char* bob[];

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

4

4 回答 4

11

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

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

这个说法是错误的

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

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

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

或者

strncpy(bob,"hello",6);

您在这里不需要 nul,因为字符串常量"hello"将由编译器放置 null。

于 2010-02-11T02:39:57.840 回答
1
char * bob = "hello"; 

这实际上转化为:

const char __hello[] = "hello";
char * bob = (char*) __hello;

你不能改变它,因为如果你写了:

char * bob = "hello"; 
char * sam = "hello"; 

可以翻译成:

const char __hello[] = "hello";
char * bob = (char*) __hello;
char * sam = (char*) __hello;

现在,当你写:

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

首先为 bob 分配一个值,然后为它分配一个新值。你真正想做的是:

char * bob = new char[6];    
strcpy(bob, "hello");
于 2010-02-11T02:43:55.043 回答
1

编辑:这个问题被重新标记为 C++ 而不是原来存在但重新标记的 C....

行。你有几件事混淆了...... new由C ++使用,而不是C。

  • 情况1。那就是声明一个指向 char 的指针。你应该能够操纵字符串......你能在你所做的交换字符中显示代码吗?
  • 案例#2/#3。你得到了随机的废话,并发现一个 nul 终止符,即 '\0'......占据了你在 C/C++ 期间会遇到的每一个字符串,可能在你的余生中......
+-+-+-+-+-+--+
|H|e|l|l|o|\0|
+-+-+-+-+-+--+
            ^
            |
         零终结者
  • 案例#4 不起作用,因为您需要使用 a来完成这项工作,当您声明在编译时初始化的字符串时strcpy,您不能在调用之后简单地分配这样的字符串。但是当你这样做时,它会被复制到指针变量中。newchar *s = "foo";char *s = new char[6]; strcpy(s, "hello");s

你最终会发现,这个指向被占用的内存块的指针s很容易被覆盖,这会引发一系列的问题,因为你意识到你必须小心防止缓冲区溢出......记住与 nul 相关的案例#3终止符...不要忘记,实际上,该字符串的长度是 6,而不是 5,因为我们正在考虑 nul 终止符。

  • 案例#5。那就是声明一个指向char类型数组的指针,即多维数组,这样想
*(bob + 0) = "foo";
*(鲍勃+1)=“酒吧”;

我知道有很多东西要消化......但请随时发表任何进一步的想法...... :) 祝你学习好运......

于 2010-02-11T02:55:08.937 回答
1

您应该始终使用char const*指向字符串文字的指针(双引号中的内容)。尽管标准char*也允许,但它不允许写入字符串文字。GCC 给出了将文字地址分配给 的编译警告char*,但显然其他一些编译器没有。

于 2010-02-11T10:55:11.357 回答