c - 数组互相取值?

标签 c arrays sorting pointers element

写这个程序是为了找点乐子,但它让我很伤心。如果我只是将我的函数扔到一个案例中,一切都很好,但是当我一次移动到 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;
}

最佳答案

你的排序循环中有一个差一个问题:

for(int x = 0; x < numValues; x++)

应该是

for(int x = 0; x < numValues-1; x++)

因为您正在引用 x+1 处的项目。此项超过传入数组的末尾,因此访问它是未定义的行为。很多时候,未定义的行为不会在异常中返回。相反,一个意想不到的值突然出现在一些看似随机的地方。在这种情况下,由于编译器生成的内存布局,您似乎正在读取第二个数组的第一个元素。

关于c - 数组互相取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26404551/

相关文章:

objective-c - 为什么 clang 优化会破坏我的内联汇编代码?

c - C : read() returns > 0 bytes read, 中的套接字但缓冲区为零

python - 如何计算 NumPy bool 数组中真实元素的数量

Java:改变实例字段

ios - 如何计算 parse.com 查询中数组值的数量?

java - 在 java 的多个方法中使用的数组副本

C vector 作为 char *** vector

根据用户输入创建可变数量的字符串变量(C语言)

c - 在C中的函数中传递指向数组的指针

list - 如何对序言中的年龄列表进行排序?