2013-04-27 69 views
3

我想創建一個分配特定大小的內存的函數。在main中,我創建了指針,然後將指針和大小發送給要分配的內存的函數。由於某種原因它會導致各種問題。如果我在main中使用malloc,而不是通過函數,我的程序可以正常工作。malloc沒有正確地分配指針指針

int main(void){ 
    int * pointer; 
    int array_size = SIZE; 
    ... 
    allocate_memory(&pointer,array_size); 
    ... 
    free(pointer); 
} 

allocate_memory(int *pointer,int size){ 
    *pointer = (int *)malloc(size*sizeof(int)); 
    if(!(*pointer)){ 
     printf("Memory allocation fail!"); 
     exit(0); 
    } 

現在的問題是,當我嘗試釋放內存時,它給了我一個錯誤。 如果解決方案會附帶簡短說明,我將不勝感激。我開始對這些指針和鑄件的工作方式感到非常困惑。 在此先感謝!

+0

拿起任何標準書籍。整個'pointer to pointer'和'pointer to variable'東西用圖形,圖形和基本代碼很好地解釋。 – 2013-04-27 08:41:22

回答

2

有許多錯誤,在你的計劃,我指出:

  1. 您需要#defineSIZE否則程序是不會知道它是什麼。

  2. 這是更好地聲明原型的功能allocate_memory(),以便在參數類型的任何差異或類型檢測

  3. 您曾在main()通過&pointer作爲參數傳遞給allocate_array()。對於這一點,需要返回將功能定義爲allocate_memory(int **pointer,int size)而不是您已完成的allocate_memory(int *pointer,int size)
  4. if(*pointer==NULL)以更簡單的方式實現條件,並且服務於相同的目的。
  5. 使用exit(1)不成功終止,因爲exit(0)用於表示終止成功。
  6. 永遠不要忽視警告。這不是一個好習慣。

這裏是更正後的代碼。它編譯良好,沒有警告,並按預期完成作業(內存分配)。

#include<stdio.h> 
    #include<stdlib.h> 
    #define SIZE 30 

    void allocate_memory(int**,int); 

    int main(void){ 
     int * pointer; 
     int array_size = SIZE; 
     allocate_memory(&pointer,array_size); 
     free(pointer); 
    } 

    void allocate_memory(int **pointer,int size) 
    { 
     *pointer = malloc(size*sizeof(int)); 
     if(*pointer==NULL) 
     { 
      printf("Memory allocation fail!"); 
      exit(1); 
     } 
     else 
      printf("\nMemory allocation successful"); 


    } 
+0

謝謝你的回答。我對這個論壇很新,所以我愚蠢地認爲我不必將我的原型添加到我提供的代碼中。在我的代碼中,這些原型確實存在。我只是假定人們會把它們當作是給定的。 – AYR 2013-04-27 08:28:51

+1

@AYR歡迎來到StackOverflow.People在這裏欣賞好的和真誠的問題,即使它來自初學者。 – 2013-04-27 08:30:53

+0

@SheerFish -1,創建一個內存泄漏並不好,你也會用'free(pointer)'導致未定義的行爲。在C中記住變量是通過值傳遞的。你缺乏C的基本知識。我只是試圖幫助你,如果你不同意我們可以主演一個聊天,我會很樂意解釋。 – 2013-04-27 09:03:05