数组采取彼此的价值观?

1 c arrays sorting pointers elements

试着写这个程序有点乐趣,但它给了我一些重大的悲痛.如果我只是将我的功能折腾为一个案例,那么一切都很好,但是当我一次移动2个以上的案例时,他们开始相互取值.第一个函数将第一个元素(排序后)与第二个函数的第一个元素(排序前)交换.

示例:valuesOne和valuesTwo应分别为[3,5,9,27,31]和[1,1,5,6,18,102].然而,它们最终分别为[1,3,5,9,27]和[1,5,6,18,31,102].谁能帮我这个?我觉得这可能是我指针的问题,但我现在才开始学习.

码:

#include <stdio.h>

int doubleMedian(int *values, int numValues);

int main() {
    int valuesOne[5] = {5, 31, 3, 9, 27};
    int valuesTwo[6] = {1, 6, 18, 1, 102, 5};

    int resultOne = doubleMedian(valuesOne, 5);
    int resultTwo = doubleMedian(valuesTwo, 6);

    printf("Double medians are %d and %d", resultOne, resultTwo);
}

int doubleMedian(int *values, int numValues) {
    int temp = 0, pass = 0, medianNum = 0, median = 0;

    printf("Before sort:\t");

    for(int x = 0; x < numValues; x++) {
        printf("%d, ", values[x]);
    }

    printf("\n");

    while(pass < numValues) {
        for(int x = 0; x < numValues; x++) {
            if(values[x] > values[x + 1]) {
                temp = values[x];
                values[x] = values[x + 1];
                values[x + 1] = temp;
            }
        }
        pass++;
    }

    printf("After sort:\t");

    for(int x = 0; x < numValues; x++) {
        printf("%d, ", values[x]);
    }

    if(numValues % 2 == 0) {
        medianNum = (numValues / 2) - 1;
        median = values[medianNum + 1] + values[medianNum];
    } else {
        medianNum = (numValues / 2) - 1;
        median = values[medianNum] * 2;
    }

    printf("\n\n");
    return median;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

您的排序循环中有一个逐个问题:

for(int x = 0; x < numValues; x++)
Run Code Online (Sandbox Code Playgroud)

应该

for(int x = 0; x < numValues-1; x++)
Run Code Online (Sandbox Code Playgroud)

因为你正在引用一个项目x+1.此项超过传入的数组的末尾,因此访问它是未定义的行为.通常,未定义的行为不会在异常中返回.相反,在一些看似随机的位置出现意外的价值.在这种情况下,由于编译器生成的内存布局,您看起来正在读取第二个数组的第一个元素.