Указатели в c изменяют статическое значение int - PullRequest
0 голосов
/ 27 октября 2018

Я пытался написать алгоритм mergeSort в 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);

Я получаю n, чтобы быть 1998609340 вместо 6.

Редактировать: Здесь я печатаю элементы:

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

1 Ответ

0 голосов
/ 28 октября 2018

& v не должно передаваться при вызовах к mergeSort и mergeElement. & v на самом деле имеет тип int ** , в то время как ваш прототип функции поддерживает int *. (должно быть предупреждение при компиляции вашего кода)

Привет, вот код после отладки (просто изменил & v обратно на v при вызове mergeSort & mergeElements)

#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");
}
...