【问题标题】:Why unsortedArray is changing while my code running?为什么 unsortedArray 在我的代码运行时会发生变化?
【发布时间】:2019-05-15 12:17:59
【问题描述】:

我想对给定的unsortedArray 数组进行排序。在此之前,我需要执行以下步骤。但它总是取数字 9,然后重复数字 8

#include<stdio.h>

int main(){

    int unsortedArray[] = {9,8,7,6,5,4,3,2,1};

    int arr1[9];
    int arr2[9];

    int arr1Counter = 0;
    int arr2Counter = 0;

    int i;int n;
    for(i=0; i<9; i++){

        // n = unsortedArray[i];

        int j;
        for(j=0; j<9; j++){

            if(unsortedArray[j] != unsortedArray[i]){

                if(unsortedArray[j] > unsortedArray[i]){

                    arr2[arr2Counter] = unsortedArray[i];
                    arr2Counter++;

                }else{

                    arr1[arr1Counter] = unsortedArray[i];
                    arr1Counter++;
                }
            }
        }
    }


    int k;
    for(k=0; k<9; k++){
        printf("%d ", unsortedArray[k]);
    }


    return 0;
}

【问题讨论】:

  • 最终一段时间后,您将拥有对 arr1 和 arr2 的越界访问权限,这将导致未定义的行为,您会看到它的结果,即 unsortedArray 内容正在被修改.
  • 调试器是你最好的朋友。是的,我们可以帮助您,但学习调试是一项很棒的编程技能!

标签: c arrays sorting


【解决方案1】:

您的行为未定义,因为arr2[9] 溢出。在您的嵌套循环中,这部分

arr2[arr2Counter] = unsortedArray[i];
arr2Counter++;

执行 36 次。因此,您的访问权限越界,这会导致未定义的行为。在我的机器上,8 7 6 5 4 3 2 1 被打印出来,但程序随后因为堆栈损坏而崩溃。

考虑程序的逻辑。 for (j = 0; j &lt; 9; j++) {里面的部分一共被执行了72次,每次在arr1或者arr2中增加一个条目。它们都可以分别保存10 值,因此它们不能保存所有72 值。

【讨论】:

    【解决方案2】:

    为什么会发生变化?因为arr1Counter 或arr2Counter(或两者兼有)可能会比您使用它们访问的数组的大小更大。

    细节较少:

       for (i = 0; i < 9; i++){
            for (j = 0; j < 9; j++){
                 //maybe increment either here
            }
        }
    

    这可能会超过 9。 因此,您可能会损坏数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-09
      • 2021-12-18
      • 2015-09-14
      • 2018-07-31
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多