繁体   English   中英

C ++ char数组正确移动了空终止符?

[英]C++ char array move null terminator properly?

嗨,我的问题很难解释,因此我将在此处发布我的代码部分,并举例说明问题。

此处的代码有一个大数组和一个小数组,其中大数组分成小部分,存储在小数组中,小数组在屏幕上输出其内容。
之后,我释放分配给小数组的内存,并使用大数组的下一部分再次对其进行初始化:

//this code is in a loop that runs until all of the big array has been copied
char* splitArray = new char[50];        
strncpy(splitArray, bigArray+startPoint, 50); //startPoint is calculated with every loop run, it marks the next point in the array for copying

//output of splitArray on the screen here

delete splitArray;
//repeat loop here

现在我的问题是输出的字符串每次末尾都有一些随机符号。 例如"some_characters_here...last_char_hereRANDOM_CHARS_HERE".

在深入研究之后,我发现splitArray的大小实际上不是50,而是64,空终止符为64。因此,当我从bigArray复制到splitArray时,在实际字符串和后面还有14个随机字符当然我不想输出它们。

一个简单的解决方案是在[50]处在splitArray中手动设置空终止符,但是程序无法再次删除该数组。

有人可以帮我找到解决方案吗? 最好带有一些示例代码,谢谢。

如果您只设置splitArray[49] = 0 ,程序将如何“无法再次删除数组”? 别忘了,一个长度为50的数组从0到49进行索引splitArray[50] = 0正在写入为splitArray分配的内存之外的内存,这带来了所有后果。

当为splitArray分配内存时,内存中不会填充NULL字符,因此需要明确地执行此操作。 因此,您的字符串未正确以NULL终止。 为此,您可以执行char* splitArray = new char[51](); 在分配本身时使用NULL字符进行初始化(请注意,我正在分配51个字符,以在末尾具有额外的NULL字符)。 另请注意,您需要执行delete[] splitArray; 而不是delete splitArray;

只需这样做就足够了:

char* splitArray = new char[50 + 1];        
strncpy(splitArray, bigArray+startPoint, 50);
splitArray[50] = '\0';

我真的很想问您为什么仍然要这样做。 这更干净:

std::string split(bigArray+startPoint, 50);

它仍会执行副本,但会为您处理(取消)分配和终止。 您可以像下面这样获得底层的字符指针:

char const *s = split.c_str();

它会正确地以n终止,并且具有与字符串对象相同的生存期(即,您无需freedelete它)。


注意 我没有更改您的原始代码,但是丢失不可思议的整数文字也将是一个好主意。

函数strncpy的缺点是,如果源字符串包含50个以上的字符,则该字符串不会终止目标字符串。 好像在您的情况下一样!

如果这确实是C ++,则可以使用std::string splitArray(bigArray+startPoint, 50)

我发现您的代码有几个问题:

  1. 如果使用new []分配,则需要使用delete []释放(而不是delete
  2. 您为什么仍然使用免费商店? 从我所看到的,您不妨使用本地数组。
  3. 如果要在一个数组中存储50个字符,则需要51个终止空字符。

您需要一些代码:

while(/* condition */)
{
    // your logic

    char splitArray[51];
    strncpy(splitArray, bigArray+startPoint, 50);
    splitArray[50] = '\0';

    // do stuff with splitArray
    // no delete
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM