代码崩溃编译器:main()返回一个struct而不是int

时间:2010-06-07 23:06:49

标签: c visual-studio-2008 visual-c++ crash compiler-errors

我正在尝试一段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;

编译器不会崩溃。

3 个答案:

答案 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)