Передача массива в функцию для выделения памяти

#c #arrays #memory #malloc

#c #массивы #память #malloc

Вопрос:

У меня проблема с этим кодом:

Main():

 ...
int main()
{

    int i=0, choice=0;

    int *array_val=NULL;

    while((choice=menu_sort())!=9)
    {

        switch(choice)
        {
        case 1:
            i=ins_val(amp;array_val, i);
            break;
....
  

Я вызываю ins_val() функцию из другого источника:

 int ins_val(int **array_val, int i)
{

    int j=0, add=0, k=0;

    system("cls");

    printf("Number to add: ");
    scanf("%d", amp;add);

    i  ;

    reall(array_val, i);

    *array_val[i-1]=add;

    for (j=(i-1); j>0; j--)
    {

        if (*array_val[j]<(*array_val[j-1]))
        {

            k=(*array_val[j-1]);
            *array_val[j-1]=(*array_val[j]);
            *array_val[j]=k;

        }

    }

    return i;

}
  

и

 void reall(int **array_val, int i)
{

    int *arr=NULL;
    arr=malloc(sizeof(int)*i);

    int j=0;

    for (j=0; j<i-1; j  )
    {

        arr[j]=(*array_val[j]);

    }

    int size=(sizeof(int)*i);

    free(*array_val);

    (*array_val)=(int*)malloc(size);

    if ((*array_val)!=NULL)
    {

        for (j=0; j<i-1; j  )
        {

            (*array_val[j])=arr[j];

        }

        free(arr);

    }

    else
    {

        ...

    }

    return;

}
  

Я хочу создать динамический массив, в котором я могу сохранять значения и упорядочивать их.

Моя проблема в том, что выделение памяти, потому что я могу сохранить только одно значение в array_val массиве, даже если с malloc() я выделяю sizeof(int)*i , поэтому, когда я пытаюсь сохранить второе значение, я получаю ошибку.

Комментарии:

1. *array_val[j] —> (*array_val)[j]

Ответ №1:

Вам нужно изменить свои назначения с:

 (*array_val[j])=arr[j];
  

Для:

 (*array_val)[j] = arr[j];
  

Кроме того, у вас есть два цикла, в которых отсутствует индекс:

 for (j=0; j<i-1; j  )
  

Это должно быть:

 for (j = 0; j < i; j  )
  

Но ошибка segfault заключается в том, что *array_val = NULL когда вы передаете его ins_val() . Этот код в reall() необходимо изменить с:

 for (j=0; j<i-1; j  )
{

    arr[j]=(*array_val[j]);

}

int size=(sizeof(int)*i);

free(*array_val);
  

к чему-то вроде этого:

 if (*array_val) {
        for (j=0; j<i; j  )
            arr[j]=(*array_val)[j];
        free(*array_val);
    }

    int size=(sizeof(int)*i);
  

В этом цикле вы пытались разыменовать нулевой указатель, так как *array_val сначала имеет значение NULL.