在std :: strcpy中使用char *

时间:2012-09-17 08:54:30

标签: c++

这是我的代码......

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

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

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

这可以运行没有错误。但是,我想用......

char* s

我该怎么办?

5 个答案:

答案 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::stringstd::begin函数,它适用于std::endstd::string m1(""); std::string m2("sth"); std::copy(std::begin(m2), std::end(m2), std::begin(m1)); 版本:

m2

编辑:它的工作时间{{1}}是静态保留的,因此可以在编译时推断出长度。