我想清楚以下代码的所有优点/缺点:
{
char *str1 = strdup("some string");
char *str2 = "some string";
free(str1);
}
字符串1:
- 可以修改字符串的内容
字符串2:
- 您不必使用 free()
- 快点
还有其他区别吗?
如果可以,两者都不使用,并通过以下方法之一避免使用
static char const str3[] = { "some string" };
char str4[] = { "some string" };
str3
如果你从不打算修改它,str4
如果你这样做了。
str3
确保程序中没有其他函数可以修改您的字符串(字符串文字可能是共享的和可变的)。str4
在堆栈上分配一个恒定大小的数组,因此分配和释放没有开销。系统只需复制您的数据。
使用原始字符串 - 无论是源中的文字、内存映射文件的一部分,甚至是程序的另一部分“拥有”的分配字符串 - 都具有节省内存的优势,并可能消除你的丑陋错误条件如果您执行分配(可能会失败),则必须处理。当然,缺点是您必须跟踪这个字符串不被当前使用它的代码“拥有”的事实,因此它不能被修改/释放。有时这意味着您需要在结构中使用一个标志来指示它使用的字符串是否已分配给该结构。对于较小的程序,这可能只是意味着您必须通过几个函数手动遵循字符串所有权的逻辑并确保它是正确的。
顺便说一句,如果字符串将被一个结构使用,一个很好的方法来避免必须保留一个标记是否为结构分配的标志是为结构和字符串分配空间(如果需要) 只需一次调用malloc
. 然后,无论字符串是为结构分配的还是从字符串文字或其他来源分配的,释放结构总是有效的。