使用strcat时访问冲突写入位置错误

时间:2010-11-04 15:20:12

标签: c++ c

在C ++中使用strcat函数时遇到问题。

如果我这样做:

MyClass::MyClass(char* myString){

char* AnotherString = myString;
strcat(AnotherString, "bob");

}

然后一切都很好。但是,如果我这样做:

MyClass::MyFunction(){

char* AnotherString = "fred";
strcat(AnotherString, "bob");

}

我在strcat.asm中遇到一个未处理的异常。有什么想法吗?

此致

3 个答案:

答案 0 :(得分:8)

你需要的答案......

是使用C ++:

std::string anotherString = "fred";
anotherString += "bob";

你可能想要的答案......

是Let_Me_Be和Moo-Juice所说的,结合起来。

这段代码:

char* anotherString = "fred";

非常危险,应该尽量避免。 fred存储在内存的只读部分中,无法更改 - 出于所有实际目的,它基本上与const char*相同。请注意,char anotherString[] = "fred";是一个完全不同的故事,因为它实际上存储了fred副本,可以随意修改。

然而,正如Moo-Juice指出的那样,strcat将第二个参数连接在第一个之后,这意味着第一个字符串必须有足够的分配空间来容纳它们。因此,在您的情况下,char anotherString[] = "fred";对您没有好处,因为anotherString只有5个字节长。然后你应该写:

char anotherString[8] = "fred"; // fred + bob + 1
strcat(anotherString, "bob");

当然,在现实世界中,您可能不会提前知道字符串大小,因此您可以使用malloc来分配充足的缓冲区。

答案 1 :(得分:7)

strcat(dest, src)中“dest”指向的缓冲区必须足够大以容纳结果字符串。所以:

char* anotherString = "fred"; // 5 bytes including zero-terminator

例如,没有“鲍勃”的空间。

但是,你已经用C ++发布了这个,那你为什么还要使用strcat()?

#include <string>

std::string another = "fred";
another.append("bob");

答案 2 :(得分:1)

首先,编译器不应该允许你编译它(没有警告):

char* str = "fred";

正确的代码是:

const char* str = "fred";

字符串文字是常量,因此您无法修改其内容。