繁体   English   中英

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

[英]What am I doing wrong (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]
它与数组定义有关吗?
看来我有严重的误解,请帮帮我!

在C中,当您有int num[10]; ,您的索引需要从0到9,从不应该到10。因此,仔细检查您的代码,如果在程序运行期间任何时间ij最终以10的值结尾,那就不好了。

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

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

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

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],则必须声明数组int num [11],然后才能访问num [10]。

数组基础

整数num [10]

  • 阵列容量= 10
  • 此数组的每个元素都是整数。
  • 第一个元素索引为0。因此,如果要访问第一个元素,则num [0]
  • 最后一个元素的索引是9。因此,如果要访问最后一个元素,索引必须是array-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/了解更多信息

欢迎编程! 我相信您对如何在C中建立索引有点困惑。

大多数语言(包括C语言)中的数组都称为零索引数组。 这意味着数组的开头始终在位置0。因此,如果您进行int num [10],则尝试访问num [10]实际上根本不是一个有效的调用,因为开头是num [0]。 因此,您只能从num [0]到num [9]访问。

这是一个容易犯的错误,尽管有时我已经编程多年了,但是在漫长的夜晚中,我仍然会犯傻数组索引问题。

other code示例中,您正在执行以下操作:

int num[10];

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

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

您的工作示例从0-9 ,从不尝试读取num[10] ,因此它可以工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM