C语言 如何将 malloc 数组传递给另一个函数以更改其值



我正在尝试实现一种气泡排序算法,但有 3 个函数,一个gen_array生成数组,给定值的大小和最大值,以及一个排序以气泡排序方式对值进行排序。我无法让排序部分工作。但是,gen_array函数正在做它应该做的事情,当我调用它并在 main(( 上打印其值时工作。

这是代码。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int gen_array(int ** list, int size, int max) {
    *list = (int *)malloc(size * sizeof(int));
        if (*list == NULL){
        printf("ERROR: out of memoryn");
        return 1;
    }
    srand( (unsigned)time( NULL ) );
    for (int i = 0; i < size; ++i) {
        (*list)[i] = rand() % max;
    }
    return 0;
}
int sort(int * a, int s) {
    int *temp;
    for (int i = 1; i < s; ++i) {
        for (int j = 0; j < i - 1; ++j) {
            if (*(a + i) > *(a + i + 1)) {
                *(a + i) = temp;
                *(a + i) = *(a + i + 1);
                *(a + i + 1) = temp;
            }
        }
    }
    return 0;
}
int main() {
    int size;
    printf("array Size --> ");
    scanf("%d", &size);
    int * a;
    gen_array(&a ,size, 100);
    for (int i = 0; i < size; ++i) {
        printf("%d ", a[i]);
    }
    printf("n");
    sort(a, size);
    for (int j = 0; j < size; ++j) {
        printf("%d", a[j]);
    }
    free(a);
    getchar();
    return 0;
}

在关注@mch的评论后,我得到了这个输出,

阵列大小 --> 5

1 4 46 4 51

1 4 4 0 0

进程已完成,退出代码为 0

因此,该列表由 5 个元素生成,但是排序部分不起作用,我相信排序代码是正确的(气泡算法(,但指针没有正确使用?也许我应该使用 realloc(( 复制数组的内容?

代码中有几个有问题的错误。

首先,温度应该是int的,而不是int*的。请记住,a是指向堆中数组开头的指针。 *(a + i) 是该数组的第i个元素的值。

其次,温度应该设置为*(a + i),而不是相反。

此外,正如Weather Vane在评论中指出的那样,循环是错误的。您需要检查数组元素jj + 1,而不是i。作为其中的一部分,还需要进行一些其他更改,但您可以在下面看到这些更改。

这是具有这些更改的排序方法(我认为其余的都可以,除了您需要在第二次列出项目时添加空格(:

int sort(int *a, int s) {
    int temp;
    for (int i = 0; i < s; ++i) {
        for (int j = 0; j < s - i - 1; ++j) {
            if (*(a + j) > *(a + j + 1)) {
                temp = *(a + j);
                *(a + j) = *(a + j + 1);
                *(a + j + 1) = temp;
            }
        }
    }
    return 0;
}

最新更新