我目前正在编写一个安全字符和安全列表的小库(我将在未来的项目中添加.c / .h文件)而且有些事情困扰着我,我知道有些人会认为它是主观的但我认为有一个“真正的”最佳方式。我搜索过,但没有什么可以给我一个密切的答案。以下是我的代码示例。
使用的结构和功能:
typedef struct _secure_list
{
cookie secret; // MUST be set to Cookie
secure_char * schar;
struct _secure_list * next;
} secure_list;
typedef struct _secure_char
{
int length; // number of characters in the string
char * str; // the string (no \0 byte at the end of the string)
} secure_char;
/**
* Create a secure list with schar
* Initialize Cookie on first use
**/
ret_value createSecureList( secure_char * scIn, secure_list ** slist )
我认为有两种方法可以编写createSecureList函数:
// FIRST WAY
ret_value createSecureList( secure_char * scIn, secure_list ** slist )
{
(*slist) = NULL;
(*slist) = (secure_list *) malloc( sizeof(secure_list) );
// we copy the secure_char so it can be freed in the caller
createSecureChar("",&((*slist)->schar));
concat2SecureChar(&((*slist)->schar), scIn);
...
}
// SECOND WAY
ret_value createSecureList( secure_char * scIn, secure_list ** slist )
{
(*slist) = NULL;
(*slist) = (secure_list *) malloc( sizeof(secure_list) );
(*slist)->schar = scIn;
...
}
在我的主要()中我有:
void main()
{
secure_list * slist_Test;
secure_char * schar_Test;
....
createSecureChar("test test",&schar_test);
createSecureList(schar_Test,&slist_Test);
....
}
我的问题是,尽管第二种方式更容易编码和理解,但作为链接列表的安全列表将指向与schar_Test相同的内存空间,因此如果我们释放其中一个,我们释放两者。第一种方法基本上创建了schar_Test的副本,因此可以在调用函数中释放它。
有人能告诉我哪种方式“正确”吗?