创建char阵列时,其长度与所需的长度不同
When creating a char array, its length is different from required
我需要创建一个具有str
数组长度的newStr
数组。但是创建后strlen(newStr)
完全不同。例如,如果strlen(str)
为5,那么strlen(newStr)
将是22.我在做什么错?
#include <iostream>
using namespace std;
int main()
{
char *str = "Hello";
int strLength = strlen(str);
std::cout << "str = " << str << "t" << "strLength = " << strLength << std::endl;
char *newStr = new char[strLength];
std::cout << "newStrLength = " << strlen(newStr) << std::endl;
system("pause");
return 0;
}
控制台将是
str = Hello strLength = 5
newStrLength = 22
您正在混合两个不同的概念:
-
new[]
将非原始的内存块分配给您的程序, -
strlen(...)
在达到null终结器' '
之前计算c字符串中的字符。
无法用strlen
测量分配的块的大小。实际上,它根本无法测量 - 您的程序必须知道其要求的内存,并确保它不会超过限制。
分配了new char[n]
后,您可以将长度的C字符串安全地复制到n-1
中。C 可以保证将有足够的内存供您成功完成操作:
char *newStr = new char[strLength+1]; // Note +1 for null terminator
strcpy(newStr, str);
std::cout << "newStrLength = " << strlen(newStr) << std::endl;
delete[] newStr;
strlen的工作方式是它检查字符串的内容传递给它,并计算有多少个字符,直到第一个终止字符为止。字符串的终止字符为' 0'(或0)。
要求您所做的工作的长度未分配任何值;导致Strlen检查随机内存;寻找第一个0。在这种情况下,它发现了22个字节进一步向下;但这可能是什么。它甚至可能崩溃,因为您开始查看没有阅读访问的内存。
解决此问题的最佳方法是使用std :: string,然后您可以调用长度和其他助手功能,而不必担心基础指针过多。这也将解决您的内存泄漏。
相关文章:
- 创建具有特定值的特定格式的char*
- 如何创建一个 char *[] 变量,以便将其传递给函数
- 为什么调用 cout.operator<<(const char*) 打印地址而不是字符串? 如何创建一个函数本地静态"HashSet<char>"并初始化它一次?
- 使用 const char * 与 char * 创建自己的字符串
- 试图创建动态分配的char数组时的分割故障
- 创建进程使用路径时出现错误事件:类型 "char *" 的 E0167 参数与类型 "LPWSTR" 的参数不兼容
- C MPI创建并发送具有字段char [16]和整数的结构数组
- 安全的方法来为char []字段创建Getter
- 创建char阵列时,其长度与所需的长度不同
- 如何创建一个构造函数,该构造函数吸收char阵列
- 如何创建 std::vector of char/std::byte,其中第一个字节对齐到 16 个字节,但没有填充
- 释放从char*创建的_bstr_t
- 当输入应该是 int 时,如何为 char 创建异常
- 删除从C++中的堆之一的Char[]创建的堆上的字符串
- c++ MFC:从Char*创建CString时内存泄漏
- 管理用新char*创建但用自定义分配器分配给std::vector元素的内存块
- 从char*创建UTF-16字符串
- 当每个字符串由"new char[]"创建时,如何对"vector<string>"的元素调用"delete"?
- 从const char*创建一个流函数
- 从向量<char>创建最长的字符串