超大缓冲区中的C字符串null终止符

时间:2014-04-04 02:38:17

标签: c null c-strings null-terminated

注意:

这是关于纯C.没有C ++函数等的问题


问题:

假设我malloc缓冲区有100 chars的空间。然后,我只用实际chars填充其中5个插槽。我听说最佳做法是将缓冲区中所有剩余的插槽都清空,如下所示:

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

这是非常必要的,还是我可以设置buffer[5] = '\0'并为自己保存一个循环?


上下文:

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

我不可能事先知道琴弦的大小。因为重新分配是如此昂贵,我最初选择一个大的缓冲区大小。我的目标是桌面级硬件,因此内存根本不受限制。

4 个答案:

答案 0 :(得分:1)

如果您正在复制它的字符串,则可以使用strncpy复制字符串,并为您填充额外的缓冲区空间{/ 1}}。

如果由于某种原因您使用\0或手动复制字符串然后是,则可以保存循环,因为所有标准字符串操作(strcpystrlen等)无论如何都将停在第一个strcpy

答案 1 :(得分:0)

简短的回答是肯定你是对的。你应该只需要一个在数组中最后一个char之后的空指针。

典型的答案是,为什么不使用char指针?类似于字符串的char *可以帮助您解决整个问题,并且有一些库可以更轻松地操作这些库。您不需要以这种方式直接分配内存。为什么你有一个特定的原因需要100个缓冲区?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用Calloc()函数代替。它会自动将内存块初始化为零(即相当于分配NULL,因为NULL的ASCII代码为0)。然后,您不需要将每个槽明确分配给Null。