这是我的代码...
char* m1;
char* m2 = "sth";
strcpy(m1, m2);
该代码引发了运行时错误,所以我尝试了...
char m1[];
char m2[] = "sth";
那可以毫无错误地运行。但是,我想使用...
char* s
我该怎么办?
这是我的代码...
char* m1;
char* m2 = "sth";
strcpy(m1, m2);
该代码引发了运行时错误,所以我尝试了...
char m1[];
char m2[] = "sth";
那可以毫无错误地运行。但是,我想使用...
char* s
我该怎么办?
你应该allocate
记住m1
. 例如
char* m1 = new char[4];
char* m2 = "sth";
strcpy(m1, m2);
// so smth with m1
delete[] m1;
但是,既然您使用 C++ 编写,为什么不使用std::string
?
问题是您没有分配任何内存来存储 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 是静态分配的,不必释放。
在 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();
问题消失了。
另外,您不再需要为缓冲区大小和适当的释放而烦恼。
我相信即使你的第二个例子也是无效的
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 仍然不了解什么是数组,什么是指针。对此进行一些额外的阅读和思考。
首先,在执行复制之前,您必须确保目标指针有足够的内存来保存副本,否则会出现运行时错误。所以你需要这个:
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::string
version :std::begin
std::end
std::string m1("");
std::string m2("sth");
std::copy(std::begin(m2), std::end(m2), std::begin(m1));
编辑:只要m2
静态保留它就可以工作,因此可以在编译时推断出长度。