将任何类型的参数传递给C中的函数
我想问一下,是否可以使用与指针void相同的“void”变量(可以存储指向任何类型数据的指针,如将任何类型的参数传递给C中的函数,c,C,我想问一下,是否可以使用与指针void相同的“void”变量(可以存储指向任何类型数据的指针,如int,char等)。例如,function(void variable)可以向其传递任何变量,如function(4)或function(“hi”) 谢谢大家! PD:我正在做一个与简单链表相关的练习(通过结构) typedef结构\u GNodo{ void*dato;struct\u GNodo*sig; }格诺多; 格利斯特格利斯特阿格雷加决赛(格利斯特利斯塔,无效达托){ GNodo*nue
int
,char
等)。例如,function(void variable)
可以向其传递任何变量,如function(4)
或function(“hi”)
谢谢大家!
PD:我正在做一个与简单链表相关的练习(通过结构)
typedef结构\u GNodo{
void*dato;struct\u GNodo*sig;
}格诺多;
格利斯特格利斯特阿格雷加决赛(格利斯特利斯塔,无效达托){
GNodo*nuevoNodo=malloc(sizeof(GNodo));
新诺多->达托=达托;
新节点->sig=NULL;
if(lista==NULL)
返回新瓦诺多;
GList nodo=lista;
for(;nodo->sig!=NULL;nodo=nodo->sig);
/*最后一个元素是什么*/
nodo->sig=nuevoNodo;
返回列表a;
}
否,编译器需要知道参数的大小。它与指针一起工作,因为void*
具有已知的大小,但void
没有。否,编译器需要知道参数的大小。它与指针一起工作,因为void*
具有已知的大小,但void
没有。这在标准C中是不可能的。请阅读例如或某些较新的标准。由于某些实现在CPU寄存器中传递参数(例如,int
和double
的不同寄存器)
另请参见
,它至少需要一个固定参数
您还可以传递指向某些union
的指针,或指针和其他类型的union
。当然,您需要一个有文档记录的约定来选择union
成员。阅读更多关于。学习或的源代码以获取灵感。它们是软件
顺便说一句,GList可用于(其部分)。仔细研究它,它是一个编写良好的开源工具包:下载其源代码并进行研究。它有一些
还可以考虑在您的C源代码上使用、或甚至(上面用于以C或C++编写的嵌入式代码的静态分析器)。对于Frama-C或Bismon,请通过电子邮件与我联系至basile。starynkevitch@cea.fr
如果使用编译C代码,如
gcc-Wall-Wextra-g
,则使用调试器了解程序的行为。这在标准C中是不可能的。请阅读例如或某些较新的标准。由于某些实现在CPU寄存器中传递参数(例如,int
和double
的不同寄存器)
另请参见
,它至少需要一个固定参数
您还可以传递指向某些union
的指针,或指针和其他类型的union
。当然,您需要一个有文档记录的约定来选择union
成员。阅读更多关于。学习或的源代码以获取灵感。它们是软件
顺便说一句,GList可用于(其部分)。仔细研究它,它是一个编写良好的开源工具包:下载其源代码并进行研究。它有一些
还可以考虑在您的C源代码上使用、或甚至(上面用于以C或C++编写的嵌入式代码的静态分析器)。对于Frama-C或Bismon,请通过电子邮件与我联系至basile。starynkevitch@cea.fr
如果使用编译C代码,如
gcc-Wall-Wextra-g
,则使用调试器了解程序的行为。否,因为编译器在编译时必须知道参数大小,如果要传递泛型对象,则应传递void*,这很好,因为指针的大小在编译时是已知的。不,您不能这样做,因为编译器必须在编译时知道参数的大小。如果要传递泛型对象,您应该传递void*,相反,这很好,因为指针的大小在编译时是已知的。在您的情况下,您可以:
List GList_agregar_final(GList lista, const void *dato, size_t dataSize) {
GNodo *nuevoNodo = malloc(sizeof(*nuevoNodo));
/* check if allocation did not fail */
nuevoNodo->dato = malloc(dataSize);
/* check if allocation did not fail */
memcpy(nuevoNodo -> dato, data, dataSize);
nuevoNodo->sig = NULL;
/* ... */
不要在仅对象的大小中使用类型,如我的示例中所示在您的情况下,您可以:
List GList_agregar_final(GList lista, const void *dato, size_t dataSize) {
GNodo *nuevoNodo = malloc(sizeof(*nuevoNodo));
/* check if allocation did not fail */
nuevoNodo->dato = malloc(dataSize);
/* check if allocation did not fail */
memcpy(nuevoNodo -> dato, data, dataSize);
nuevoNodo->sig = NULL;
/* ... */
不要像我的示例中那样在仅对象的大小中使用类型,但从代码中看,这并不能回答您的问题,但从你的代码中看,你并没有意识到这一点。这能回答你的问题吗?哦,好的,谢谢你!!哦,好的,谢谢你!!