创建char数组时,其长度与所需的不同

时间:2017-12-07 11:57:12

标签: c++ arrays char

我需要创建一个长度为 MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=yourEmail MAIL_PASSWORD=youPassword MAIL_ENCRYPTION=tls 数组的newStr数组。但在创建之后str完全不同。例如,如果strlen(newStr)为5,那么strlen(str)将是22.我做错了什么?

strlen(newStr)

在控制台中将是

#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;
}

2 个答案:

答案 0 :(得分:1)

您正在混淆两个不同的概念:

  • new[]将未初始化的内存块分配给您的程序,
  • strlen(...)在到达空终结符'\0'之前对C字符串中的字符进行计数。

无法使用strlen测量已分配块的大小。实际上,它根本无法测量 - 您的程序必须知道它请求了多少内存,并确保它没有超出限制。

分配new char[n]后,您可以安全地将长度为n-1的C字符串复制到该块中。 C ++保证有足够的内存供您成功完成操作:

char *newStr = new char[strLength+1]; // Note +1 for null terminator
strcpy(newStr, str);
std::cout << "newStrLength = " << strlen(newStr) << std::endl;
delete[] newStr;

答案 1 :(得分:1)

strlen的工作方式是检查传递给它的字符串的内容,并计算在第一个终止字符之前有多少个字符。字符串的终止字符是&#39; \ 0&#39; (或0)。

您要求完成的内容是否为您未分配任何值的字符串的长度;导致strlen检查随机记忆;寻找第一个0.在这种情况下,它发现它进一步向下22个字节;但它可能是任何东西。它甚至可能会崩溃,因为你开始查看你没有读取权限的内存。

解决这个问题的最好方法是使用std :: string然后你可以调用length和其他辅助函数,而不必过多担心底层指针;这也将解决你的内存泄漏。