for循环的C运行时错误

时间:2014-07-30 22:28:02

标签: c for-loop runtime

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

#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

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

3 个答案:

答案 0 :(得分:3)

将函数main声明为

int main() 

并删除声明return;或将其替换为return 0;

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

答案 1 :(得分:1)

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

Miscrosoft编译器

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

Gcc编译器

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

使用void

#include <stdio.h>

int array[10];

void main(void) {
    int i;

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

使用int

#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; 
}

使用带返回

的void的另一个示例
#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。您可能没有使用这样的实现。)