【问题标题】:Program crashing with undefined reason?程序因未定义原因而崩溃?
【发布时间】:2015-05-15 17:31:11
【问题描述】:

这是我的简单程序。我运行了很多次。有时它会弹出警告并破坏 Turbo C。为什么?我使用的是 32 位 Windows 7。

#include <stdio.h>
#include <conio.h>

void main(){
int arr[10][10];
int i,j;
clrscr();
    for(i=1;i<11;i++){
        for(j=1;j<11;j++){
        arr[i][j]=i*j;
        printf("%d\t",arr[i][j]);
        }
        printf("\n");
    }
}

【问题讨论】:

  • 这就是为什么还应该在 c 代码上运行静态分析器的原因,例如,gimpel-online.com//cgi-bin/…{{quotedIncludeOption}},抱怨
  • 它不会因为“未定义的原因”而崩溃。它崩溃了,因为您明确告诉它访问不属于您的内存。 C 数组从 0 开始索引,而不是 1。

标签: c turbo-c


【解决方案1】:

很简单,原因是c中的数组索引是从0到N - 1。

所以不是

for (i = 1 ; i < 11 ; ++i)

必须是

for (i = 0 ; i < 10 ; ++i)

因为在您的情况下N 是10,当然j 也是如此。

如你所见,这不是未定义的原因,它肯定是未定义的行为,但原因是你的代码中的一个错误,所以总是先责怪你的代码,它最有可能成为对意外行为负责,如果您证明您的代码有效并且我的意思是一种数学证明类型的证明,那么您可以责怪编译器或您喜欢的任何人。

【讨论】:

    【解决方案2】:

    在这一行:

    arr[i][j]=i*j;
    

    i 和 j 的值范围为 1 到 10。但是,ar[10][10] 实际上超出了数组范围。

    由于 C 遵循基于 0 的索引,因此更改此:

    for(i=1;i<11;i++){
        for(j=1;j<11;j++){
    

    到这里:

    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      相关资源
      最近更新 更多