创建char阵列时,其长度与所需的长度不同

When creating a char array, its length is different from required

本文关键字:char 创建 阵列      更新时间:2023-10-16

我需要创建一个具有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,然后您可以调用长度和其他助手功能,而不必担心基础指针过多。这也将解决您的内存泄漏。