2016-10-19 41 views
-2

我有此代碼的問題:)傳遞陣列用於存儲器分配函數

主要(:

... 
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++) 

但段錯誤是因爲*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在第一。