在 std::strcpy 中使用 char*

Using char* in std::strcpy

本文关键字:char std strcpy      更新时间:2023-10-16

这是我的代码...

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

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

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

它可以运行而不会出错。但是,我想使用...

char* s

我做什么灵魂?

你应该为m1 allocate内存。例如

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  */
char* m2 = "sth";

比你能做的

最后,您必须释放任何动态分配的内存,例如。

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 对,并注意必须删除使用 new[] 保留的内存,即删除 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

因为如果您使用 std::beginstd::end 函数,它适用于 char *std::string 版本:

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

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

相关文章: