我的函数应该复制`char*`-arguments吗?

ima*_*ake 2 c string conventions

每当我有一个带c字符串的函数,并希望将其值存储在链表中时,我应该像这样做...

void add(char* str)
{
    node *n = malloc(sizeof(node));
    n->value = str;
}
Run Code Online (Sandbox Code Playgroud)

更确切地说...

void add(char* str)
{
    node *n = malloc(sizeof(node));
    char* copy = malloc(strlen(str)+1);
    strcpy(copy, str);
    n->value = copy;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Adr*_*son 7

这实际上取决于争论的来源,以及你对这些论点的意图.

如果您知道作为参数传递的字符串始终在链表的整个生命周期内可用,并且它们未被修改或释放,或者没有任何会产生影响链表的副作用的函数,那么你可以简单地复制指针而不用费心去复制整个字符串.

如果上述任何一个不成立(我的意思是如果你不知道上述其中一个的答案),那么复制整个字符串会更安全.

一些具体的例子:

  • 您正在开发一个小应用程序,它读取csv文件,将值存储在链接列表中进行排序,然后将值写回xml文件:您可以控制字符串的整个生命周期,您不必复制它们.

  • 你正在编写一个链接列表库,可能在网上发布,可能被数百名活跃在各种领域的人使用:你不知道什么会被传递到你的库,你不知道库用户是否将在操作链表之前释放字符串,然后复制整个字符串.

还要注意这种设计决策更好地记录在某处:作为开发人员,你有责任明确你的函数将存储指针而不复制字符串,或者你将复制字符串并需要另一个函数调用来释放记忆.(这被称为合同设计:您使用您的函数和函数本身建立代码之间的契约,您最好尊重它,否则您将遇到数据损坏或软件崩溃的问题).明确意图的一种可能方法是使用适当放置的const关键字.