2

这是我的代码...

char* m1;
char* m2 = "sth";
strcpy(m1, m2);

该代码引发了运行时错误,所以我尝试了...

char m1[];
char m2[] = "sth"; 

那可以毫无错误地运行。但是,我想使用...

char* s

我该怎么办?

4

5 回答 5

2

你应该allocate记住m1. 例如

char* m1 = new char[4];
char* m2 = "sth";
strcpy(m1, m2);
// so smth with m1
delete[] m1;

但是,既然您使用 C++ 编写,为什么不使用std::string?

于 2012-09-17T08:55:55.067 回答
1

问题是您没有分配任何内存来存储 strcpy 方法的结果。你需要:

char* m1 = (char *) malloc(sizeof(char) * 4) /* 4 being the size of 3 chars + trailing \0 */
char* m2 = "sth";

比你可以做的 strcpy

最后你必须释放任何动态分配的内存 ag

free(m1)

m2 是静态分配的,不必释放。

于 2012-09-17T08:56:51.893 回答
1

在 C++ 中,你宁愿这样做:

// don't forget to #include <string>
std::string m1;
std::string m2 = "sth";
m1 = m2;

如果你需要一个const char*(例如,对于一些 API 调用)你可以得到一个

const char* str = m1.c_str();

问题消失了。

另外,您不再需要为缓冲区大小和适当的释放而烦恼。

于 2012-09-17T10:02:40.897 回答
0

我相信即使你的第二个例子也是无效的

char m1[];
char m2[] = "sth"; 

m1 没有任何有效的内存来存储复制的数据。而且,我相信您应该在声明中包含数组维度(您没有在这里声明方法参数)

通常你应该有类似的东西

char m1[10];
char m2[] = "sth"; 
strcpy(m1, m2);

回到问题。很多人说你应该分配内存才能使用 char*。没错,但更准确地说,您应该让指针指向有效的内存。

分配内存是一种方法,但您也可以执行以下操作:

char outdata[100];
char* m1 = &(outdata[10]);
char* m2 = "foo";
strcpy(m1, m2);

这里没有明确的分配,仍然是一个有效的例子。

我相信 OP 仍然不了解什么是数组,什么是指针。对此进行一些额外的阅读和思考。

于 2012-09-17T09:23:36.853 回答
-2

首先,在执行复制之前,您必须确保目标指针有足够的内存来保存副本,否则会出现运行时错误。所以你需要这个:

char* m1;
char* m2 = "sth";
m1 = new char[strlen(m2)+1]; // <---- reserve memory for m1
strcpy(m1, m2);
// remember to delete[] m1

另一种处理字符串的方法是使用std::string类,如果你这样做,内存管理不会打扰你。

std::string m1("");
std::string m2("sth");
m1 = m2; // no strcopy needed, no memory management needed

最后,如果由于某种原因您必须处理指针,请注意 new/delete 对,并记住必须使用 delete[] 删除使用 new[] 保留的内存

以及额外的建议:而不是memcpy我更喜欢使用std::copy

char* m1;
char* m2 = "sth";
m1 = new char[strlen(m2)+1]; // <---- reserve memory for m1
std::copy(std::begin(m2), std::end(m2), std::begin(m1));
// remember to delete[] m1

因为如果您使用and函数,它适用于 thechar *std::stringversion :std::beginstd::end

std::string m1("");
std::string m2("sth");
std::copy(std::begin(m2), std::end(m2), std::begin(m1));

编辑:只要m2静态保留它就可以工作,因此可以在编译时推断出长度。

于 2012-09-17T09:07:57.677 回答