2016-10-19 2 views
-2

У меня есть проблема с этим кодом:Передача массива функционировать для выделения памяти

Main():

... 
int main() 
{ 

    int i=0, choice=0; 

    int *array_val=NULL; 

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

     switch(choice) 
     { 
     case 1: 
      i=ins_val(&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", &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, поэтому, когда я пытаюсь сохранить второе значение, я получаю сообщение об ошибке.

+0

'* array_val [j]' -> '(* array_val) [j]' – BLUEPIXY

ответ

0

Вы должны изменить assigments от:

(*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 в первом.

Смежные вопросы