一个变量的地址被分配给整型变量,而没有错误(只是一个警告)在C Language.how这是可能的吗??任何人都可以解释吗?代码:
int main()
{
int a=9;
int *x=&a;
int y=&a;
printf("%d\n",y);
printf("%p",x);
return 0;
}
代码输出:
test.c: In function 'main':
test.c:7:11: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
int y=&a;
^
6422292
0061FF14
我期待在整数变量中存储地址时出错。
2条答案
按热度按时间kkbh8khc1#
这是怎么可能的??...我期待在整数变量中存储地址时出现错误。
int y=&a;
违反了C 2018 www.example.com 1中简单赋值的约束6.5.16.1,该约束列出了右操作数允许的几种类型组合,其中左操作数具有_Bool
以外的算术类型的唯一组合,如int
所做的,表示右操作数也必须具有算术类型,而&a
没有:...左操作数具有原子、限定或非限定算术类型,右操作数具有算术类型...
C 2018 5.1.13 1说明了符合规范的C实现必须为此做些什么:
如果预处理翻译单元或翻译单元违反任何语法规则或约束,则一致性实现应至少生成一条诊断消息(以实现定义的方式标识),......
警告是一个诊断信息。因此它满足C标准的要求。这回答了你的问题“这怎么可能?”
在编译器中启用警告并将警告升级为错误。对于Clang,从
-Wmost -Werror
开始。对于GCC,从-Wall -Werror
开始。对于MSVC,从/W3 /WX
开始。brccelvz2#
因为编译器除了给予你一个某种形式的消息外,没有义务做任何其他的事情。
没有所谓的“只是一个警告”。一个警告通常意味着:“这里有一个严重的错误,你必须修复它,使你的程序按预期运行”。它通常不意味着:“这里有一些小的外观问题,你可以忽略”。