【问题标题】:int array sort modifies the array contentint array sort 修改数组内容
【发布时间】:2016-08-21 12:14:03
【问题描述】:

我正在编写处理字符串和整数数组的代码。

这个编译运行正常,但是数组的内容被修改了。

代码给出了最大数字的主要结果。 但是,在排序过程之后,我显示了数组的内容,其中一个元素被修改为 0。 那么,这是什么原因呢?

问候,

#include<stdio.h>
#include<string.h>
#include<stdint.h>

int main()
{

static uint8_t arr2[]={5,100,-2,75,42},cr=0,ps=1,temp=0;
uint8_t i;

for (i=0;i<sizeof(arr2);i++)
{
    printf("1stloop[%d]\n",i);
    if (arr2[cr]>arr2[ps])
    {
        printf("before change1 cr %d ps %d\n",arr2[cr],arr2[ps]);
        temp=arr2[cr];
        arr2[cr]=arr2[ps];
        arr2[ps]=temp;
        printf("change1        cr %d ps %d\n\n",arr2[cr],arr2[ps]);

        if (arr2[cr-1]>arr2[ps-1])
        {
            printf("before change2 cr %d ps %d\n",arr2[cr-1],arr2[ps-1]);
            temp=arr2[cr-1];
            arr2[cr-1]=arr2[ps-1];
            arr2[ps-1]=temp;
            printf("change2        cr %d ps %d\n\n",arr2[cr-1],arr2[ps-1]);
        }
    }
    cr++; ps++;
}
    for (i=0;i<sizeof(arr2);i++)
{
    printf("contents %d \n",arr2[i]);
}
printf("\nLargest No. in arr2 of arr2 is %d \n",(arr2[sizeof(arr2)]));
return 0;
}

【问题讨论】:

  • 当 cr==0 时,您正在使用 arr2[cr-1]。索引 -1 在您的数组之外。当 ps == sizeof(arr2) == 5 时,您也在使用 arr2[ps]。索引 5 也在您的数组之外。最后打印的最大数字来自数组之外的索引 5。当您将最大的数字交换到此处,即在您的数组之外,您将碰巧为零的垃圾交换到您的数组中。
  • 使用调试器单步调试代码以了解实际情况。
  • 是的,谢谢,我添加了 printf("OK");在循环中查看问题出在哪里。它实际上是关于循环计数器的,它现在可以工作了。

标签: c arrays sorting int


【解决方案1】:

如果您在执行 for 循环的最后一步时干运行您的代码,则值将是 i=4,cr=4,ps=5。您可以看到 arr2[] 的总元素为 5,但您正在尝试将代码中的第 5 个元素与第 6 个元素进行比较因此它将第 6 个元素作为 0 并根据您的逻辑执行。

所以在for循环条件下可以进行修改。


而不是这个for (i=0;i&lt;sizeof(arr2);i++) 你可以试试这个for (i=0;i&lt;sizeof(arr2) &amp;&amp; ps&lt;sizeof(arr2);i++)


这不会修改数组的条目。但由于它是无符号字符,元素'-2'的条目将被视为'254'。

【讨论】:

  • 我做了这段代码,它工作正常!静态 int8_t arr2[]={5,100,-2,75,42},cr=0,ps=1,temp=0; uint8_t i,cnt=sizeof(arr2); printf("之前的数组:\n"); for (i=0;i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多