【发布时间】:2014-11-01 17:33:28
【问题描述】:
我写了一个简单的 C 程序,我期待它在编译时会失败,但不幸的是它在 C 中编译并运行良好,但在 C++ 中编译失败。 考虑下面的程序:
#include <stdio.h>
int main()
{
char *c=333;
int *i=333;
long *l=333;
float *f=333;
double *d=333;
printf("c = %u, c+1 = %u",c,c+1);
return 0;
}
访问此链接:http://ideone.com/vnKZnx
我认为由于 C++ 的强类型检查,这个程序肯定不能在 C++ 中编译。为什么这个程序用 C 编译?这是编译器也显示警告的事实。我正在使用 Orwell Dev C++ IDE(gcc 4.8.1 编译器)。我还在其他编译器(Borland Turbo C++ 4.5)上尝试了相同的程序,通过扩展名 .c 保存它,但在这个编译器上它无法编译。
【问题讨论】:
-
@hacks 程序的哪一部分调用了未定义的行为?只要您不取消引用它,将随机值分配给指针变量是完全有效的。
-
@5gon12eder;这部分:
printf("c = %u, c+1 = %u",c,c+1);。需要解释吗? -
@hacks 没错,
%u应该改为%p。但这与 meet 的问题无关,也没有解释程序编译的原因。 -
@JensGustedt;我承认我的评论具有误导性,因此我将其删除。但我认为有UB,虽然可执行文件无效。
-
@davmac 未定义的行为包括“终止翻译或执行”。
标签: c pointers variable-initialization