Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将任何类型的参数传递给C中的函数_C - Fatal编程技术网

将任何类型的参数传递给C中的函数

将任何类型的参数传递给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

我想问一下,是否可以使用与指针void相同的“void”变量(可以存储指向任何类型数据的指针,如
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;
  /* ... */

不要像我的示例中那样在仅对象的大小中使用类型,但从代码中看,这并不能回答您的问题,但从你的代码中看,你并没有意识到这一点。这能回答你的问题吗?哦,好的,谢谢你!!哦,好的,谢谢你!!