Dav*_*ith 2 c pointers type-equivalence assign
以下分配仅导致警告.关于C如何对待类型等价,这说了什么?
int *iptr;
float *fptr;
float fval;
fval = 0.0;
fptr = &fval;
iptr = fptr;
Run Code Online (Sandbox Code Playgroud)
特别是,我指的是上面代码片段的最后一行中的赋值; 即,
iptr = fptr;
Run Code Online (Sandbox Code Playgroud)
它更多地说明了你使用的编译器的行为而不是关于C的行为,尽管C标准允许编译器的行为(不幸的是恕我直言).
类型int*和float*不同,语言定义它们之间没有隐式转换.
尝试在没有强制转换的情况下将一个分配给另一个(即显式类型转换)是违反约束,这意味着需要编译器发出诊断消息.
C标准不要求这种诊断是致命的.通过发出警告,就C标准而言,编译器已完成其工作.它可以在相同的有效性下拒绝您的程序(在我看来,这将更加用户友好).但这两种行为都是一致的.
您可以以某种方式调用编译器,使其将其视为致命错误.例如,如果您正在使用gcc,那么-pedantic-errors选项(以及指定要使用哪个版本的C标准的选项)应该可以解决问题.
如果你真的想要执行该任务(包含所有需要的风险),你可以使用强制转换:
iptr = (int*)fptr;
Run Code Online (Sandbox Code Playgroud)
除了(可能)关闭编译器警告,指针应该投作为你正在做的事情非常棘手的提醒,它可能在你的脸上吹,如果你don'w知道究竟你在做什么.