这是我的代码......
char* m1;
char* m2 = "sth";
strcpy(m1, m2);
该代码引发了运行时错误,所以我尝试了......
char m1[];
char m2[] = "sth";
这可以运行没有错误。但是,我想用......
char* s
我该怎么办?
答案 0 :(得分:2)
allocate
你应该m1
内存。
例如
char* m1 = new char[4];
char* m2 = "sth";
strcpy(m1, m2);
// so smth with m1
delete[] m1;
但是既然你用C ++写作,为什么你不使用std::string
?
答案 1 :(得分:1)
问题是你没有分配任何内存来存储strcpy方法的结果。你需要:
char* m1 = (char *) malloc(sizeof(char) * 4) /* 4 being the size of 3 chars + trailing \0 */
char* m2 = "sth";
你可以做strcpy
最后你必须释放任何动态分配的内存a.g。
free(m1)
m2是静态分配的,不必释放。
答案 2 :(得分: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();
问题消失了。
另外,您不再需要打扰缓冲区大小和正确的释放。
答案 3 :(得分: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仍然不了解什么是数组,什么是指针。获得一些额外的阅读和思考。
答案 4 :(得分:-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
最后,如果由于某种原因你必须处理指针,请处理新的/删除对并重新考虑memory reserved with new[] must be deleted wit delete[]。
以及其他建议:我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
:
char *
如果您使用std::string
和std::begin
函数,它适用于std::end
和std::string m1("");
std::string m2("sth");
std::copy(std::begin(m2), std::end(m2), std::begin(m1));
版本:
m2
编辑:它的工作时间{{1}}是静态保留的,因此可以在编译时推断出长度。