在 std::strcpy 中使用 char*
Using char* in std::strcpy
这是我的代码...
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::begin
和 std::end
函数,它适用于 char *
和 std::string
版本:
std::string m1("");
std::string m2("sth");
std::copy(std::begin(m2), std::end(m2), std::begin(m1));
编辑:只要m2
是静态保留的,它就可以工作,因此可以在编译时推断长度。
- 将无符号char*转换为std::istream*C++
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 将函数参数"const char*"转换为"std::string_view"是
- std::string 构造函数如何处理固定大小的 char[]?
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- <char> 使用 Vulkan 映射内存时如何使用 std::vector 而不是 void**?
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- C++:将模板类型 char 转换为 std::string
- 有效地将数据加载到 std::vector 中<char>
- 为什么 char 可以在 std::array 中初始化为 nullptr,而不是单独初始化?
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- 未定义模板"std::__1::basic_istringstream<char, std::__1::char_traits<char>, std::__1::allocator&
- 获取未知分段错误"(地址)在 std::__cxx11::basic_string<char, std::char_traits<char>,..., std::分配器<cha
- 如何创建 std::vector of char/std::byte,其中第一个字节对齐到 16 个字节,但没有填充
- C++和Visual Studio错误 - 不存在从"std::basic_ostream<char, std::char_traits<char>>"到"int"的合适转换功
- 将 std::vector 的一部分转换为<char> std::array<char, n>, c++11
- 错误:与 std::operator<< <std::char_traits<char> >(*&std::cout),((常量字符*)中的运算符<<不