我写了一小段我觉得可以工作的代码,我得到了控制台中显示的所有值,但不久之后我收到了运行时错误。任何人都知道为什么?
#include <stdio.h>
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
任何帮助将不胜感激,谢谢!
答案 0 :(得分:3)
将函数main声明为
int main()
并删除声明return;
或将其替换为return 0;
将函数main声明为void并使用不带表达式的return语句会导致程序的未定义行为。
答案 1 :(得分:1)
我不知道您使用的是哪种编译器。由于大多数情况它取决于编译器和操作系统的行为。不同的编译器提供不同的行为
如果使用Microsoft Compiler,则编译时不会显示任何警告消息。因此有时候开发人员不知道事情的原因是什么。在你的情况下,同样的事情发生你不要使用return语句或如果你想使用return然后使用改变Vlad提供的东西。完整的功能就像这样
如果您正在使用GCC,它将生成警告消息,因为GCC下的默认有效类型是int main并返回0;最后。
#include <stdio.h>
int array[10];
void main(void) {
int i;
for(i = 0; i < 10; i++){
array[i] = i;
printf("%i", array[i]);
}
}
#include <stdio.h>
int array[10];
int main(void) {
int i;
for(i = 0; i < 10; i++){
array[i] = i;
printf("%i", array[i]);
}
return 0;
}
#include <stdio.h>
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;
}
}
上面的例子不会产生错误,因为函数没有到达循环结束而你之前已经返回过。因此,这里不会生成内存访问语音。
答案 2 :(得分:0)
您的代码中有几个问题,可能原则上会导致某种运行时错误,但是我没有“期望导致此类错误
#include <stdio.h>
int array[10];
void main() {
正如其他人所提到的,这不是定义main
函数的标准方法之一。出于您的目的,由于您没有使用命令行参数,因此正确的定义是:
int main(void) {
C标准(1990年,1999年和2011年版)确实允许托管实施允许main
的其他形式;例如,Microsoft的编译器特别允许void main(void)
(并且void main()
也可能是可接受的)。但是没有充分的理由来定义main
,返回类型为void
,因为int main(void)
保证是正确的。
如果您使用两种标准表单中的一种(另一种是main
或)以您的实施文档的方式定义int main(int argc, char *argv[])
,那么您的程序的行为未定义。
另一方面,我看到使用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"
更为常见。)
但您的输出不会被换行符终止。在许多系统上,输出只会在没有行尾标记的情况下打印,这可能会弄乱您的终端显示屏。在其他情况下,可能需要尾随换行符,并且未提供一行会导致未定义的行为。 (你不需要在 all 你的输出上换行,就在最后。)
}
我会添加类似
的内容putchar('\n');
这里,只是为了确定。
return;
没有表达式的return;
在void
函数中完全有效 - 尽管在函数的最后没有必要,因为到达结束}
会隐式{{ 1}}无论如何。但是,如果您将return
正确定义为为main
,那么这应该是int main(void)
。从C99开始,到达return 0;
的结束}
相当于执行main
,因此并不是绝对必要的 - 但仍然有编译器不完全支持C99(很多少了C11),所以添加return 0;
并不是一个坏主意。
return 0;
以下是修改这些问题的程序版本, 应该100%可移植到所有符合要求的托管C实现:
}
预期输出为:
#include <stdio.h>
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
语句和尾随换行符)以确切地了解纠正的内容问题。
了解您正在使用的编译器和操作系统对非常有帮助。
(我已经提到过“托管实现”。另一种C实现是“独立式”;它指的是嵌入式系统的实现,其中代码可以直接在没有操作系统的硬件上运行。在这样的系统上,大多数标准库是可选的,并且程序入口点的正确定义完全是实现定义的;它甚至可能不被称为return
。您可能没有使用这样的实现。)