你的 malloc(0) 是错误的。正如其他人指出的那样,最终可能会或可能不会分配一点内存,但无论 malloc 实际上对 0 做了什么,在这个简单的示例中,您都应该分配至少 3*sizeof(char) 字节的内存。
所以在这里我们有一个正确的麻烦。假设您为字符串分配了 20 个字节,然后用 19 个字符和一个 null 填充它,从而填充了内存。到现在为止还挺好。但是,请考虑您想在字符串中添加更多字符的情况;你不能把它们放在适当的位置,因为你只分配了 20 个字节并且你已经使用了它们。您所能做的就是分配一个全新的缓冲区(例如 40 个字节),将原来的 19 个字符复制到其中,然后在末尾添加新字符,然后释放原来的 20 个字节。听起来效率低下不是吗。而且它效率低下,分配内存需要大量工作,而且与其他语言(例如 C++)相比,您只需连接 str1 + str2 即可。
除了在底层,这些语言必须做完全相同的事情,即分配更多内存和复制现有数据。如果有人关心高性能,那么 C 会让您更清楚地花时间在哪里,而 C++、Java、C# 之类的语言则将昂贵的操作隐藏在方便使用的类后面。这些类可能非常聪明(例如,分配比严格必要的更多的内存以防万一),但如果您有兴趣从硬件中提取最佳性能,则必须做好准备。
这类问题是 Facebook 和 Twitter 等运营商在发展服务方面遇到困难的原因。迟早那些方便但低效的类方法加起来是不可持续的。