在void *函数中返回float

Gun*_*tan 4 c pointers return function

我正在学习指针的工作方式,但是我不理解此代码中的一件事。在void *函数中返回int就像一个超级按钮,但返回float却没有。

#include <stdio.h>

void* square (const void* num);

int main() {
  int x, sq_int;
  x = 6;
  sq_int = square(&x);
  printf("%d squared is %d\n", x, sq_int);

  return 0;
}

void* square (const void *num) {
  int result;
  result = (*(int *)num) * (*(int *)num);
  return result;
}
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>

void* square (const void* num);

int main() {
  float x, sq_int;
  x = 6;
  sq_int = square(&x);
  printf("%f squared is %f\n", x, sq_int);

  return 0;
}

void* square (const void *num) {
  float result;
  result = (*(float *)num) * (*(float *)num);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 7

这两个函数都调用未定义的行为,因为返回类型和return语句中表达式的类型不匹配。

关于为什么它似乎起作用,请阅读有关未定义行为的信息。

就是说,打开编译器警告,将所有警告视为错误,并且设置该代码后,甚至不应编译该代码以生成二进制文件,因为它包含约束冲突,应该会产生诊断(警告)。

相关说明:

引自C11第6.8.6.4章

[...]如果表达式的类型不同于它所出现的函数的返回类型,则该值的转换就好像是通过分配给具有函数的返回类型的对象一样。

关于简单分配,请参见第6.5.16.1章中的简单分配

约束条件

以下条件之一应成立:

  • 左操作数具有原子,合格或不合格算术类型,而右操作数具有算术类型;
  • 左操作数具有与右类型兼容的结构或联合类型的原子,合格或不合格版本;
  • 左操作数具有原子,合格或不合格的指针类型,并且(考虑到左操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的合格或不合格版本的指针,并且左侧指向的类型具有全部右边指出的类型的限定词;
  • 左操作数具有原子,合格或不合格的指针类型,并且(考虑到左操作数在左值转换后将具有的类型),一个操作数是指向对象类型的指针,另一个是指向的合格或不合格版本的指针。无效,并且左侧指向的类型具有右侧指向的所有类型的限定符;
  • 左边的操作数是原子,合格或不合格的指针,右边的是空指针常量;要么
  • 左边的操作数的类型是atomic,qualified或unqualified _Bool,右边的是指针。

因此,您不能合法地将int或分配给float指针类型-这是违反约束的行为。