当前位置: 首页 > 知识库问答 >
问题:

C中的void函数指针返回值

葛驰
2023-03-14

我在玩C语言中的函数指针只是为了学习。我尝试调用一个空函数,并将其结果设置为int。

void function(int x, int y){
printf("%d,%d\n",x,y);
}

int main(){
    int (*fptr)(int,int);
    fptr = function;
    int a = fptr(2,3);
    printf("%d\n",a);
    return 0;
}

我从中得到的结果是:

2,3 4

在对它进行了一点研究之后,我意识到main正在函数()中打印printf语句中的字符数。为什么会这样?这是预期产出吗?

共有2个答案

屈翰飞
2023-03-14

这是预期的结果!printf()函数将返回打印的字符数。在这种情况下,fptr(2,3)将打印2,3\n,因此返回4

柴英锐
2023-03-14

这是未定义的行为,因此,任何行为都是“规范的”,包括“鼻魔”

然而,我们可以解释为什么这可能发生在许多现代平台上。

具有返回值的最后一个函数的返回值通常放在CPU的AX寄存器中。

printf是最后一个具有返回值的函数,并将4放入AX寄存器
在此期间,没有其他内容覆盖AX寄存器,变量a获取“返回值”(即使fptr没有返回值!),通过获取AX寄存器的内容,该寄存器仍然是4

 类似资料:
  • C++ 指针 在上一章中,我们已经了解了 C++ 中如何从函数返回数组,类似地,C++ 允许您从函数返回指针。为了做到这点,您必须声明一个返回指针的函数,如下所示: int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第

  • C语言允许函数的返回值是一个 指针(地址),我们将这样的函数称为 指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: 运行结果: C Language↙ c.biancheng.net↙ Longer string: c.biancheng.net 用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和

  • 我们在上一章中已经看到C编程如何允许从函数返回数组。 类似地,C还允许从函数返回指针。 为此,您必须声明一个返回指针的函数,如下例所示 - int * myFunction() { . . . } 要记住的第二点是,在函数外部返回局部变量的地址不是一个好主意,因此您必须将局部变量定义为static变量。 现在,考虑以下函数,它将生成10个随机数,并使用表示指针的数组名称返回它们

  • 我正在学习指针是如何工作的,但我不明白这段代码中的一件事。在void*函数中返回int就像一个咒语,但是返回float就不是了。

  • 问题内容: 我正在使用一个包含单个调用的.dll,该调用返回一个函数指针数组。GetMyApi()返回指向结构的指针,该结构是函数指针的数组。函数本身具有不同的单独输入和输出。到目前为止我尝试过的是: 我无法轻易更改的C代码: C中的代码: { int (__cdecl IsValidInt)(int i); int (__cdecl InvalidInt)(); int (__cdecl *Is

  • 问题内容: 我一直在玩Go制作一些数据结构库,这是一个大问题。我希望数据结构能够包含任何类型,但是在Go中我看不到任何方法可以执行此操作,因为您无法声明空指针,并且它们没有像NSObject这样的类,所有对象都可以从中继承。如何在Go中实现相同的功能? 问题答案: 根据Go编程语言规范: 类型实现包含其方法的任何子集的任何接口,因此可以实现几个不同的接口。例如,所有类型都实现 空接口 : 如果您在