我正在尝试一段C代码。任何人都可以告诉我为什么VC 9.0与SP1崩溃对我来说?哦,代码是一个用于讨论为什么像
的例子 void main (void)
是邪恶的。
struct foo { int i; double d; } main (double argc, struct foo argv)
{
struct foo a;
a.d=0;
a.i=0;
return a.i;
}
如果我把
return a;
编译器不会崩溃。
答案 0 :(得分:3)
代码给出了未定义的行为。这不需要编译器崩溃,它只是说你基本上已经破坏了规则,所以编译器没有做错任何事情,无论发生什么。
编辑:那就是说,作为一个执行质量的问题,绝对没有理由让编译器崩溃 - 合理地说,它应该总是正常退出,无论你提供什么数据。
答案 1 :(得分:2)
好的,你想提出一个深奥的问题,然后请构建一个完整的问题。
你是如何进行测试的? 崩溃是什么意思? 你的输出是什么? 你刚刚编译,编译和链接,或编译和链接和调试? 你的编译器是如何配置的? 你在这个实验的哪个阶段?
这样的短语:“像”邪恶“这样的东西不足以提供有用的信息
跟进:
本能地,我猜这次崩溃是编译器的结果 允许编译器进行的优化开关 你不符合的某些假设。
我的假设:
1- void main(void)(没有;)是您正在制作的评论的一部分,但不是 你提交的测试的一部分。
2-您的程序不正确,但这是故意调查 编译器/链接器/执行环境的行为 如果确实如此,则需要降低测试用例的复杂性。
请将测试用例简化到导致崩溃的最低限度。 我无法为你做,我没有正确版本的软件 安装,无论如何,这是你的实验。
这会崩溃吗?
struct foo { int i; double d; };
struct foo main( void)
{
int a=0;
return a;
}
甚至是这个最小的例子?
void * main(void)
{
return 0;
}
是这个(我对此表示怀疑):
int main( double argc, char ** argv)
{
return 0;
}
你明白了。减少崩溃的本质。 想出一个没有错误的程序,除了 有一件事会让它崩溃。
然后报告。
答案 2 :(得分:-2)
在结构的末端和main之间放置一个半冒号,如下所示:
struct foo {int i;双d; }; main(double argc,struct foo argv)
如果你要返回一些内容,你也可以为main定义一个返回类型:
struct foo {int i;双d; }; int main(double argc,struct foo argv)