1

嗨,我的问题有点难以解释,所以我将在这里发布我的代码部分并用一个示例来解释问题。

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

//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 个随机字符和当然我不想输出它们。

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

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

4

5 回答 5

0

只需这样做就足够了:

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();

它将被正确地以 nul 终止,并且与字符串对象具有相同的生命周期(即,您不需要freedelete它)。


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

于 2012-02-15T12:34:59.327 回答
0

该函数strncpy的缺点是它不会终止目标字符串,如果源字符串包含超过 50 个字符。好像你的情况一样!

如果这真的是 C++,你可以用std::string splitArray(bigArray+startPoint, 50).

于 2012-02-15T12:35:45.937 回答
0

如果您刚刚设置,程序如何“再次删除数组失败” splitArray[49] = 0?不要忘记,长度为 50 的数组的索引从 0 到 49。splitArray[50] = 0正在写入分配给的内存之外的内存,splitArray这会带来所有后果。

于 2012-02-15T12:27:23.777 回答
0

当您splitArray为未填充NULL字符的内存分配内存时,您需要明确地这样做。因此,您的字符串未正确以 NULL 结尾。为此,您可以char* splitArray = new char[51]();在分配时使用 NULL 字符进行初始化(请注意,我分配了 51 个字符以在末尾添加额外的 NULL 字符)。. 另请注意,您需要做delete[] splitArray;和不做delete splitArray;

于 2012-02-15T12:28:15.170 回答
0

我发现您的代码存在一些问题:

  1. 如果你通过 using 分配new [],你需要 free with delete [](not delete)
  2. 你为什么还要使用freestore?从我所见,您不妨使用本地数组。
  3. 如果要在数组中存储 50 个字符,则需要 51 个作为终止空字符。

你想要一些代码:

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

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

    // do stuff with splitArray
    // no delete
}
于 2012-02-15T12:39:55.287 回答