gpt4 book ai didi

c - void * 函数形式参数的用法

转载 作者:行者123 更新时间:2023-12-02 06:03:09 24 4
gpt4 key购买 nike

#include<stdio.h>
#include<stdlib.h>

void function(void *i, void *j);

struct mystruct {
int a;
int b;
} ;

int main()
{

int a = 50;

struct mystruct s ;
s.a = 100;
s.b = 200;
function(&a, &s);


}


void function(void *i, void *j)
{
printf("Integer is %d\n", *i);
printf("Struct member 1 is %d\n", j->a);
printf("Struct member 2 is %d\n", j->b);


}

我上面的代码。在编译时我得到以下错误,我明白我需要做什么来修复它们。

voidstartest.c: In function function:
voidstartest.c:27: warning: dereferencing void * pointer
voidstartest.c:27: error: invalid use of void expression
voidstartest.c:28: warning: dereferencing void * pointer
voidstartest.c:28: error: request for member a in something not a structure or union
voidstartest.c:29: warning: dereferencing void * pointer
voidstartest.c:29: error: request for member b in something not a structure or union

这是我需要做的来修复错误:

printf("Integer is %d\n", *(int*)i);

printf("Struct member 1 is %d\n", ((struct mystruct *)j)->a);

printf("Struct member 2 is %d\n", ((struct mystruct *)j)->b);

问题:

  1. 如果我必须按照上面描述的方式修复错误,这是否意味着我必须提前知道我发送给函数的指针类型?我觉得这是一个非常严格的要求。不是吗?

  2. 一些库函数也有形式参数 void *(如 qsort)。他们的实现如何知道指针的正确类型是什么,以便他们可以取消引用它以处理实际数据(它指向)?

最佳答案

  1. 是的。这意味着您不能以类型不可知的方式编写函数,因此需要重新考虑您的设计。在使用 void* 时,通常会编写一个模板函数,并向用户询问函数指针,这些函数指向可识别类型并执行基本操作的函数。

  2. 他们的实现没有。他们还以我上面描述的相同方式要求您提供函数指针或大小参数。

关于c - void * 函数形式参数的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16591436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com