我做错了什么(C数组)?

时间:2011-12-02 18:58:06

标签: c arrays

我只是C.的初学者 我正在尝试制作一个简单的程序来按升序排列用户输入的数字。我已经找到了解决方案,但无法理解为什么我的其他代码不起作用:(

-------------------------------------------------------------------------
working code:
-------------------------------------------------------------------------
#include <stdio.h>
int main()
{
    int i,j,num[10];
 printf("Enter 10 numbers\n");
 for (i=0;i<10;i++)
  {scanf("%d",&num[i]);}


    for (i=0;i<9;i++)
     {
         for (j=i+1;j<10;j++)
           {
               if (num[i]>num[j])
                 {
                    num[i]+=num[j];
                    num[j]=num[i]-num[j];
                    num[i]=num[i]-num[j];
                 }
           }
     }
    printf("The numbers in ascending order are:");
    for (i=0;i<10;i++)
      {
          printf(" %d",num[i]);
      }

    return 0;
}
-------------------------------------------------------------------------
code that won't work:
-------------------------------------------------------------------------
#include <stdio.h>
int main()
{
    int i,j,num[10];
 printf("Enter 10 numbers\n");
 for (i=1;i<=10;i++)
  {scanf("%d",&num[i]);}


    for (i=1;i<10;i++)
     {
         for (j=i+1;j<=10;j++)
           {
               if (num[i]>num[j])
                 {
                    num[i]+=num[j];
                    num[j]=num[i]-num[j];
                    num[i]=num[i]-num[j];
                 }
           }
     }
    printf("The numbers in ascending order are:");
    for (i=1;i<=10;i++)
      {
          printf(" %d",num[i]);
      }

    return 0;
}

在后一个程序中,数字出现乱序,甚至还有未输入的数字。

我的问题是,它的代码基本相同吗?只是在后一个程序中,数字将从num[1]存储到num[10]而不是num[0]num[9]? 它与数组定义有关吗?
看来我有严重的误解,请帮帮我!

6 个答案:

答案 0 :(得分:8)

在C中,当你有int num[10];时,你的索引需要从0到9,从不到10.所以查看你的代码,如果有ij结束在程序运行期间任何时候都是10,这是个坏消息。

答案 1 :(得分:1)

C中的索引从0开始。所以当你声明一个大小为10的数组,并且你试图获得索引为10的元素时,你实际上得到了第11个元素。由于您尚未定义第11个元素,因此数组很可能会从内存中获取一些随机数,这就是您注意到已输入注释的数字的原因。

由于您不熟悉编程,我建议您现在花些时间真正了解C如何管理内存,以及不同的数据结构如何访问内存。现在可能有点无聊,但是你将来会为自己省去一些麻烦,你将开始建立良好的习惯和良好的做法,这将导致编写好的,最佳的代码

答案 2 :(得分:0)

在非工作示例中,您的内存访问无效。例如,当i = 9且j = 10时,您访问num [10],这是无效的内存。

答案 3 :(得分:0)

for(i=0;i<9;i++)  //**i<9**    
   for (j=i+1 ...)

如果i = 8则j = 9,一切正常。

在第二个代码段中:

for(i=0;i<10;i++) //**i<10**
   for (j=i+1 ...)

如果i = 9则j = 10,那么你试图访问num [10]并且它会给你错误。

如果要访问num [10],则必须声明array int num [11],然后才能访问num [10]。

数组基础

int num [10]

  • 阵列容量= 10
  • 此数组的每个元素都是整数。
  • 第一个元素索引是0.所以如果要访问第一个元素num [0]
  • 最后一个元素索引是9.所以如果你想访问最后一个元素,索引必须是数组的长度 - 1,所以num [9]
  • 数组中有10个元素,它们是:
    • num [0],num [1],num [2],num [3],num [4],num [5],num [6],num [7],num [8]和num [ 9]

您可以在http://www.cplusplus.com/doc/tutorial/arrays/

进一步了解

答案 4 :(得分:0)

欢迎编程!我相信你对如何在C中索引数组感到有点困惑。

大多数语言(包括C)中的数组称为零索引数组。这意味着数组的开始总是在位置0.所以如果你使用int [10],尝试访问num [10]实际上根本不是有效的调用,因为start是num [0]。因此,您只能从num [0]访问num [9]。

这是一个容易犯的错误,即使我已经编程了多年,有时当它是一个漫长的夜晚,我仍然会做出愚蠢的数组索引问题。

答案 5 :(得分:0)

在您的other code示例中,您正在执行此操作:

int num[10];

for(int i = 1; i <= 10; i++) {
    //...
}

这意味着您有一个包含十个空格[0-9]的数组,而对于for循环的最后一部分,您试图访问不存在的num[10]

您的工作示例来自0-9,从不尝试阅读num[10],因此可行。

与大多数语言一样,C中的数组从位置0开始,并将其计为位置1。因此,数组的最后一个元素将是您在声明变量时输入的大小减一。