c中的指针更改静态int值

时间:2018-10-27 17:41:02

标签: c algorithm pointers data-structures

我试图使用指针在C中编写mergeSort算法(我是新手)。我使用了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]);
}

这是mergeSort算法:

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);

我得到n成为1998609340而不是6

编辑:这是打印元素的位置:

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

1 个答案:

答案 0 :(得分:0)

&v不应在对mergeSort和mergeElement的调用中传递。 &v实际上是int ** 类型,而您的函数原型支持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");
}