for循环的C运行时错误

我写了一小段我认为可以工作的代码,我得到了控制台中显示的所有值,但此后不久我收到了运行时错误。 任何人都知道为什么?

#include  int array[10]; void main() { int i; for(i = 0; i < 10; i++){ array[i] = i; printf("%i", array[i]); } return; } 

输出:

 Runtime error time: 0 memory: 2248 signal:-1 0123456789 

任何帮助将不胜感激,谢谢!

将函数main声明为

 int main() 

并删除语句return; 或代替它return 0;

将函数main声明为void并使用不带表达式的return语句会导致程序的未定义行为。

我不知道你正在使用哪个编译器。 由于大多数情况它取决于编译器和操作系统的行为。 不同编译器提供不同的行为

Miscrosoft编译器

如果使用Microsoft Compiler,则在编译时不会显示任何警告消息。 因此有时候开发人员不知道事情的原因是什么。 在你的情况下,同样的事情发生你不要使用return语句或如果你想使用return然后使用更改Vlad提供的东西。 全function就是这样

Gcc编译器

如果您使用GCC,它将生成警告消息,因为GCC下的默认有效类型是int main并返回0; 到底。

使用虚空

 #include  int array[10]; void main(void) { int i; for(i = 0; i < 10; i++){ array[i] = i; printf("%i", array[i]); } } 

使用int

 #include  int array[10]; int main(void) { int i; for(i = 0; i < 10; i++){ array[i] = i; printf("%i", array[i]); } return 0; } 

使用void返回的另一个例子

 #include  int array[10]; void main(void) { int i; for(i = 0; i < 10; i++){ array[i] = i; printf("%i", array[i]); if (i == 9) then return; } } 

上面的示例不会生成错误,因为函数没有到达循环结束并且您之前已经返回。 因此,这里不会生成内存访问语音。

你的代码中有几个问题原则上可能导致某种运行时错误,但是我没想到会导致这样的错误。

 #include  int array[10]; void main() { 

正如其他人所提到的,这不是定义mainfunction的标准方法之一。 出于您的目的,由于您没有使用命令行参数,因此正确的定义是:

 int main(void) { 

C标准(1990年,1999年和2011年版)确实允许托管实施允许main其他forms; 例如,Microsoft的编译器特别允许void main(void) (并且void main()也可能是可接受的)。 但是没有充分的理由用返回类型的void定义main ,因为int main(void) 保证是正确的。

如果使用两种标准forms之一(另一种是int main(int argc, char *argv[]) 或者以实现文档的方式定义main ,那么程序的行为是未定义的。

另一方面,我看到使用void main()的最坏结果是编译时警告 – 标准甚至不要求。 一个编译器接受void main()而没有抱怨,然后生成导致运行时错误的代码,我会说,这是一个严重的错误,虽然它实际上不会违反C标准。 如果这是你所看到的错误的原因,我会感到惊讶。

  int i; for(i = 0; i < 10; i++){ array[i] = i; printf("%i", array[i]); 

这是完全可以的; 它应该打印0123456789 。 打印多个int值而没有任何分隔它们有点奇怪,但它不是一个错误。 ( "%i"相当于"%d""%d"更常见。)

但是您的输出不会被换行符终止。 在许多系统上,输出只会在没有行尾标记的情况下打印,这可能会弄乱您的终端显示屏。 在其他情况下,可能需要尾随换行符,并且未提供一行会导致未定义的行为。 (你的所有输出都不需要换行,就在最后。)

  } 

我会添加类似的东西

 putchar('\n'); 

在这里,只是为了确定。

  return; 

return; 没有表达式在void函数中是完全有效的 - 尽管在函数的最末端它是不必要的,因为到达结束时无论如何都会进行隐式return 。 但是如果你正确地main定义为int main(void) ,那么这应该是return 0; 。 从C99开始,到达main的closing }相当于执行return 0; ,所以它并不是绝对必要的 - 但仍然有编译器不完全支持C99(更不用说C11),所以添加return 0; 这不是一个坏主意。

 } 

这是您的程序版本,可以纠正这些问题,并且应该 100%可移植到所有符合要求的托管C实现:

 #include  int array[10]; int main(void) { int i; for(i = 0; i < 10; i++){ array[i] = i; printf("%d", array[i]); } putchar('\n'); return 0; } 

预期的输出是:

 0123456789 

试试这个,看看它是否纠正了运行时错误。 如果是这样,请尝试从原始程序开始,一次只更改一件事( main的定义以及return语句和尾部换行符),以确切了解纠正问题的原因。

了解您正在使用的编译器和操作系统将非常有用。

(我已经提到了“托管实现”。另一种C实现是“独立式”;它指的是嵌入式系统的实现,其中代码可以直接在没有操作系统的硬件上运行。在这样的系统上,大多数标准库是可选的,程序入口点的正确定义完全是实现定义的;它甚至可能不被称为main 。你可能没有使用这样的实现。)