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)
这两个函数都调用未定义的行为,因为返回类型和return语句中表达式的类型不匹配。
关于为什么它似乎起作用,请阅读有关未定义行为的信息。
就是说,打开编译器警告,将所有警告视为错误,并且设置该代码后,甚至不应编译该代码以生成二进制文件,因为它包含约束冲突,应该会产生诊断(警告)。
相关说明:
引自C11第6.8.6.4章
[...]如果表达式的类型不同于它所出现的函数的返回类型,则该值的转换就好像是通过分配给具有函数的返回类型的对象一样。
关于简单分配,请参见第6.5.16.1章中的简单分配:
约束条件
以下条件之一应成立:
- 左操作数具有原子,合格或不合格算术类型,而右操作数具有算术类型;
- 左操作数具有与右类型兼容的结构或联合类型的原子,合格或不合格版本;
- 左操作数具有原子,合格或不合格的指针类型,并且(考虑到左操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的合格或不合格版本的指针,并且左侧指向的类型具有全部右边指出的类型的限定词;
- 左操作数具有原子,合格或不合格的指针类型,并且(考虑到左操作数在左值转换后将具有的类型),一个操作数是指向对象类型的指针,另一个是指向的合格或不合格版本的指针。无效,并且左侧指向的类型具有右侧指向的所有类型的限定符;
- 左边的操作数是原子,合格或不合格的指针,右边的是空指针常量;要么
- 左边的操作数的类型是atomic,qualified或unqualified _Bool,右边的是指针。
因此,您不能合法地将int或分配给float指针类型-这是违反约束的行为。