2013-03-18 131 views
0
double * copyTemp=NULL; 
    double * output= malloc(sizeof(double*)*MallSize); 
    double test1[] = {1.2,2.2,3.1}; 
    double test2[]={ 0.1,0.2,0.3,0.5,0.7,1.1,1.2,2.2}; 
    int i=0; 
    int j=0; 
    addArrayInOrder(test1 ,test2,output , &counter,&i , &j,size1,size2); 
    ShrinkMemory (MallSize, counter, output , copyTemp); 
    free(output); <- this part crashes for some reason 
    return 0; 

我得到的問題是,有時當我打電話免費程序兌現。我沒有看到這個代碼中的任何錯誤,因爲我已經將temp設置爲NULL,所以只有一件事是指向該數組是ans指針。所以我應該可以在程序結束時自由地釋放內存。realloc和免費

功能看起來像

void addArrayInOrder(double *array1, double *array2, double *final, int *finalCounter, int *arry1Counter, int *array2Counter, int ArrSize1, int ArrSize2) 
{ 

    while (*arry1Counter < ArrSize1 && *array2Counter < ArrSize2) 
    { 

     if (isEqual(array1, array2, *arry1Counter, *array2Counter)) 
     { 

      *(final + *finalCounter) = *(array1 + *arry1Counter); 

      arry1Counter++; 
      (*array2Counter)++; 
      (*finalCounter)++;; 
     } 
     else if (*(array1 + *arry1Counter) > *(array2 + *array2Counter)) 
     { 

      *(final + *finalCounter) = *(array2 + *array2Counter); 
      (*array2Counter)++; 
      (*finalCounter)++; 
     } 
     else 
     { 
      *(final + *finalCounter) = *(array1 + *arry1Counter); 
      (*arry1Counter)++; 
      (*finalCounter)++; 
     } 
    } 

} 
int ShrinkMemory(int MaxSize, int MinSize, double *final, double *temp) 
{ 
    if (MaxSize != MinSize) 
    { 
     temp = realloc(final, MinSize * sizeof(double *)); 
     if (temp == NULL) 
     { 
      printf("relloc failed ! exixting /n"); 
      return 1; 
     } 
     else 
     { 

      printf("fsafda %p \n",temp); 
      printf("fsafda %p \n",final); 
      final=temp; 
      temp=NULL; 
      printf("fsafda %p \n",temp); 
      printf("fsafda %p \n",final); 
     } 
    } 
    return 0; 
} 

爲什麼會崩潰?我甚至使用prinf%對打印出來的內存和地址看起來正確

回答

3

雙打的數組,你想:

double * output= malloc(sizeof(double) * MallSize); 
//      ^^^^^^^^^^^^^^ 

(同樣爲realloc等)

+0

是的,我意識到我的壞。當我生病的時候不能真正編碼,只是在編碼部分執行得不好。 – user2135885 2013-03-18 13:12:20

2

您在重新分配finalShrinkMemory並期望改變在函數外發生的事情。 C不能像那樣工作。您需要使用雙指針(double **final)並將每個參考號碼更改爲final*final。另外要清楚的是,在這種情況下的「雙指針」意味着指向某個指針的指針(2個星號指定了該指針)。被指出的事物的類型與它無關(巧合是這裏是一個「雙」數據類型)