首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的指针更改静态int值。

C中的指针更改静态int值。
EN

Stack Overflow用户
提问于 2018-10-27 17:41:01
回答 1查看 167关注 0票数 1

我试着用指针用C编写mergeSort算法(我对指针很陌生)。我使用了static int n (n =元素数)和v (元素数组)。mergeSort算法后,每次用随机数对n值进行修改。我做错什么了?

在这里我读了输入

代码语言:javascript
复制
int *v = malloc(NMAX * sizeof(int));
int n;
scanf("%d", &n);

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

下面是mergeSort算法:

代码语言:javascript
复制
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中):

代码语言:javascript
复制
mergeSort(0, n - 1, &v);

printf("%d", n);

我让n成为1998609340而不是6

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

代码语言:javascript
复制
for (i = 0; i < n; ++i) {
    printf("%d ", v[i]);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-28 11:45:16

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

嘿,这是调试后的代码(调用mergeSort和mergeElements时,刚刚将&v改为v)

代码语言:javascript
复制
#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");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53024628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档