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() {
正如其他人所提到的,这不是定义main
function的标准方法之一。 出于您的目的,由于您没有使用命令行参数,因此正确的定义是:
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
。你可能没有使用这样的实现。)