c - c 中的指针更改 static int 值

标签 c algorithm pointers data-structures

我尝试使用指针在 C 中编写合并排序算法(我是指针的新手)。我使用了 static int n(n = 元素数)和 v(元素数组)。 mergeSort算法后,每次用随机数修改n值。我做错了什么?

这里我读取了输入

int *v = malloc(NMAX * sizeof(int));
int n;
scanf("%d", &n);

int i;
for (i = 0; i <  n; ++i) {
    scanf("%d", &v[i]);
}

这是合并排序算法:

void mergeSort(int st, int dr, int *v) {
    if (st < dr) {
        int mij = (st + dr) / 2;
        mergeSort(st, mij, &v);
        mergeSort(mij + 1, dr, &v);
        mergeElements(st, dr, &v);
    }
}

void mergeElements(int st, int dr, int *v) {
    int *auxArray = malloc((dr - st + 3) * sizeof(int));
    int pos = 0;
    int sPos = st;
    int mij = (st + dr) / 2;
    int dPos = mij + 1;

    for (pos = 0; pos < (dr - st + 1); ++pos) {
        if (dPos == dr + 1) {
            auxArray[pos] = v[sPos];
            sPos++;
        } else if (sPos == mij + 1) {
            auxArray[pos] = v[dPos];
            dPos++;
        } else {
            if (v[sPos] < v[dPos]) {
                auxArray[pos] = v[sPos];
                sPos++;
            } else {
                auxArray[pos] = v[dPos];
                dPos++;
            }
        }
    }
    int i;
    for (i = 0; i < pos; ++i) {
        v[st + i] = auxArray[i];
    }
    free(auxArray);
}

这是我出错的地方(在 main 中):

mergeSort(0, n - 1, &v);

printf("%d", n);

我得到的 n1998609340 而不是 6

编辑:这是我打印元素的地方:

for (i = 0; i < n; ++i) {
    printf("%d ", v[i]);
}

最佳答案

&v 不应在您对 mergeSort 和 mergeElement 的调用中传递。 &v 实际上是 int** 类型 而你的函数原型(prototype)支持 int *。 (编译代码时一定有警告)

嘿,这是调试后的代码(只是在调用 mergeSort & mergeElements 时将 &v 改回 v)

#include<stdio.h>
#include<stdlib.h>
#define NMAX 1000
void mergeElements(int st, int dr, int *v);

void mergeSort(int st, int dr, int *v) {
    if (st < dr) {
        int mij =  ( st + dr ) / 2;
        mergeSort(st, mij, v);
        mergeSort(mij + 1, dr, v);
        mergeElements(st, dr, v);
    }
}

void mergeElements(int st, int dr, int *v) {

    int *auxArray = malloc( (dr - st + 3) * sizeof(int) );

    int pos = 0;
    int sPos = st;
    int mij = ( st + dr ) / 2;
    int dPos = mij + 1;

    for (pos = 0; pos < (dr - st + 1); ++pos) {
        if (dPos == dr + 1) {
            auxArray[pos] = v[sPos];
            sPos ++;
        } else if (sPos == mij + 1) {
            auxArray[pos] = v[dPos];
            dPos ++;
        } else {
            if (v[sPos] < v[dPos] ) {
                auxArray[pos] = v[sPos];
                sPos ++;
            } else {
                auxArray[pos] = v[dPos];
                dPos ++;
            }
        }
    }
    int i;
    for (i = 0; i < pos; ++i) {
        v[st + i] = auxArray[i];
    }

    free(auxArray);

}

int main()
{
    int *v = malloc( NMAX * sizeof(int) );
    int n;
    scanf("%d", &n);
    int i;
    for (i = 0; i <  n; ++i) {
        scanf("%d", &v[i]);
    }
    mergeSort(0,n-1,v);
    for(int i=0;i<n;i++)
    {
        printf("%d ",v[i]);
    }
    printf("\n");
}

关于c - c 中的指针更改 static int 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53024628/

相关文章:

c++ - 后缀(前缀)增量、左值和右值(在 C 和 C++ 中)

c - 我对 C 编程有点陌生。我需要帮助将文件(test.txt)中的字符串推送到不带逗号的数组中

algorithm - 通过使用动态规划找到站点的最佳位置来最小化管道成本

c - 如何定义一个字符串数组,分配与定义分开?

c++ - “Integer constant is so large that it is unsigned”编译器警告有理

c - gdb 无法打印数组的内容

algorithm - 找到最接近其他点的点

algorithm - 这个具体情况是一个两条边相连的图吗?

c - 将复合文字分配给数组指针会在同一地点和时间同时给出预期结果和垃圾?

c - 在c中动态分配动态分配的字符串数组