我需要创建一个长度为 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;
}
答案 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和其他辅助函数,而不必过多担心底层指针;这也将解决你的内存泄漏。