【问题标题】:Returning a value from a void function从 void 函数返回一个值
【发布时间】:2014-03-28 17:14:42
【问题描述】:

我有一个想法,void 函数并不意味着“不返回任何东西”,而是返回具有未知类型的东西,比如void *,它是一个指针,您可以将它与任何类型的数据一起使用。所以我写了下面的代码来确定:

#include <stdlib.h>
#include<stdio.h>
void x_function(void *);
void x_function(void *d)
{
    printf("the integer value of d is %d \n " , *(int *)d );
    printf("the string  value of d is %s \n " , (char *)d );
    printf("the character value of d is %c \n " , *(char *)d );
    printf("the double value of d is %lf \n " , *(double *)d );
    return 10;
}

int main()
{
    int x = (int)x_function(520);
    printf("The Value is : %d" , x);
    return 0;
}

但编译器报错:

error: invalid use of void expression
  int x = (int)x_function(520);

那我的想法错了吗?
void 函数只是“不返回任何内容的函数”吗?

【问题讨论】:

  • 是的,你错了,你现在发现了!
  • 好的,但是知道这一点,虽然你不能返回一个值,你可以在一个返回类型为void的函数中使用return;。可以用来提前突破功能,时不时会变得真正有用​​。

标签: c function void


【解决方案1】:

是的,你的想法是错误的。 void 函数不能返回任何内容。您可以返回 void * 的原因是,正如 @JohnBode 在 cmets 中提到的那样,“语言标准指定指向 void 的指针可以转换为或从任何对象指针类型 (6.3.2.3/1) 转换” .指针的值被压入堆栈,然后在您返回时弹出。然后可以将结果转换为任何类型的指针。使用void 函数,编译器不需要从堆栈中弹出任何内容,因此它不会。

【讨论】:

  • “指针的大小是恒定的,不管是什么类型”——这不一定是真的;指向不同类型的指针可能有不同的大小和表示。
  • @JohnBode ,我认为我们设置了一个指针的类型来告诉计算机它可以从这个地址移动多远,例如如果我们有 int* ,它告诉计算机向上移动从起始地址开始的 4 个字节,是吗?
  • @Learner JohnBode 谈论的是指针本身的大小,而不是指针指向的数据的大小。指针递增的量取决于指针指向的类型;这就是为什么增加 void* 没有意义的部分原因。
  • @Learner 在数据存储器与程序存储器分开的计算机上(所谓的哈佛架构),您有指向数据存储器中数据的指针和指向程序存储器中常量数据的指针。在某些平台(微控制器)上,您可能有 256 字节的数据存储器和 64 KB 的程序存储器。此类平台上的指针大小范围为 1 到 3 个字节; void* 将足够大以容纳最大的指针。
  • @Learner 通常,操作系统通过设置适当的寄存器“告诉”您的程序每个内存段的位置。不过,这并不普遍——在一些缺乏操作系统的系统上,程序“只知道”每个段的位置。
【解决方案2】:

是的,你是对的:void 函数不返回任何内容,而指向 void 的指针可以引用任何数据类型。

【讨论】:

    【解决方案3】:

    我认为它返回的东西类型未知

    这是错误的。

    当函数的返回类型为void时,表示该函数没有返回值。

    具有以下功能的程序在 C 中无效:

    void foo(int a)
    {
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      这是我的编译器在编译时返回的内容

      t.c: In function ‘x_function’:
      t.c:10:5: attention : ‘return’ with a value, in function returning void [enabled by     default]
      t.c: In function ‘main’:
      t.c:15:5: attention : passing argument 1 of ‘x_function’ makes pointer from integer without a cast [enabled by default]
      t.c:4:6: note: expected ‘void *’ but argument is of type ‘int’
      t.c:15:5: erreur: utilisation invalide d'expression void
      

      所以当函数的返回类型是void 时,你不能返回一些东西。

      根据输入类型,我觉得void *不精确,你可以传入一个char **类型,然后转换成你想要的任何类型。这就是在 main 函数中使用 args 所做的,以在命令行中收集您的参数并将其提供给您的程序。

      【讨论】:

        【解决方案5】:

        你投错了。要正确投射,请执行以下操作:

        int x = ((int(*)(void*)x_function)(520);
        

        【讨论】:

          【解决方案6】:

          如果你在 c 编程中使用指针,你可以从 void 函数返回值。

          【讨论】:

            猜你喜欢
            • 2016-08-28
            • 2023-01-28
            • 2021-04-02
            • 1970-01-01
            • 2017-08-09
            • 2015-01-24
            • 1970-01-01
            • 2016-04-22
            • 2021-12-18
            相关资源
            最近更新 更多