C 将void*指针从函数返回到其他函数参数
我正在尝试构建一个处理元素的通用列表 程序中的每个对象(指向结构的指针)都应使用此列表 这是void*的定义,从现在起它就是元素。 和添加函数签名:C 将void*指针从函数返回到其他函数参数,c,list,generics,pointers,void,C,List,Generics,Pointers,Void,我正在尝试构建一个处理元素的通用列表 程序中的每个对象(指向结构的指针)都应使用此列表 这是void*的定义,从现在起它就是元素。 和添加函数签名: typedef void* Element; void AddElementToList(List thisList , Element toAdd); 以及创建用户功能和用户定义: typedef struct FacebookUser_t* User; User CreateUser(char* const lineToSplit); 这就
typedef void* Element;
void AddElementToList(List thisList , Element toAdd);
以及创建用户功能和用户定义:
typedef struct FacebookUser_t* User;
User CreateUser(char* const lineToSplit);
这就是我调用函数的方式:
AddElementToList(thisServer->UsersList , (Element)CreateUser(line));
在调试create user函数并为其分配值时,在它返回后,对象似乎变为空,然后在add元素处被压碎。
这就是回报:
return toAdd;
“toAdd”是用户类型。
我做错了什么?没有更多信息很难说,但您需要注意对象范围: -您的
CreateUser
函数必须使用malloc
或类似方法,为堆上的FacebookUser\t
对象分配内存,并返回指向该对象的指针(键入User
;这就是@OliCharlesworth警告将指针隐藏在typedef后面的原因:User
不是用户对象,并且不分配内存)
您的最后一行提示了另一个可能的问题。您指出
toAdd
是函数addlementtolist
的一个参数,然后您谈到返回“toAdd”,但函数的类型是“void”。这里有些东西让人困惑,您可能需要查看这些部分。如果不看到这些部分,就无法判断出问题所在e CreateUser和AddElementToList的相关部分。听起来你在错误地使用基于堆栈的对象,但可能是任何对象。将指针隐藏在typedef
s后面是个坏主意;指针的语义是根本不同的,隐藏可能会导致代码难以阅读。顺便说一句,上面的const
使lineToSplit
,指针,而不是它指向的对象,是常量。您可能希望它以另一种方式运行:char const*lineToSplit
或const char*lineToSplit
(它们是等效的)。