3

笔记:

这是一个关于纯 C 的问题。没有 C++ 函数等。


问题:

假设我malloc有一个可以容纳 100 的缓冲区chars。然后,我只用实际的chars. 我听说最好的做法是将缓冲区中的所有剩余插槽清空,如下所示:

while (nextAvailableBufferSlot < currentBufferSize) 
{
    buffer[nextAvailableBufferSlot] = '\0';
    nextAvailableBufferSlot++;
}

这是绝对必要的,还是我可以简单地设置buffer[5] = '\0'并保存一个循环?


语境:

有问题的代码被非常频繁地调用,缓冲区大小为 4096,并且复制到其中的 99% 的字符串要短得多,这使得上面的循环几乎每次都运行至少几千次迭代。

我不可能事先知道字符串的大小。而且因为重新分配非常昂贵,所以我最初选择了一个大的缓冲区大小。我以桌面级硬件为目标,因此内存完全不受限制。

4

4 回答 4

1

如果您要复制的是字符串,您可以使用它strncpy来复制字符串,额外的缓冲区空间将为您填充\0

如果出于某种原因您strcpy手动使用或复制字符串,那么可以,您可以保存循环,因为所有标准字符串操作(strlen,等)无论如何strcpy都会在第一个停止。\0

于 2014-04-04T02:46:28.910 回答
0

请改用 Calloc() 函数。它会自动将内存块初始化为零(即等同于分配 NULL,因为 NULL 的 ASCII 代码为 0)。然后您不需要将每个插槽显式分配给 Null。

于 2014-04-04T15:57:38.257 回答
0

简短的回答是肯定的,你是对的。你真的应该只需要一个空指针,它紧跟在数组中的最后一个字符之后。

典型的答案是,为什么不直接使用 char 指针呢?类似字符串的 char* 为您解决了整个头痛问题,并且围绕更轻松地操作这些库而设计了一些库。您不需要以这种方式直接分配内存。为什么你有特定的理由需要正好 100 个缓冲区?

于 2014-04-04T02:45:47.843 回答
0

出于所有实际目的,您只需要NUL在填充最后一个位置后终止第一个位置。这就是任何函数在操作字符串时知道在哪里停止所需要的一切。

于 2014-04-04T02:51:47.653 回答