2013-02-21 76 views
0

我有這樣的代碼免費一個指向struct

struct PDATA{ 
    int NTH; 
    int NPH; 
    double th_start; 
    double th_step; 
    double ph_start; 
    double ph_step; 
    }; 

    typedef struct PDATA *PDATA_P; 

    struct PDATA PAT_DATA; 
    PDATA_P PAT_DATA_P; 

    PAT_DATA_P = (PDATA_P) malloc(sizeof(struct PDATA)); 
    PAT_DATA_P=&PAT_DATA; 

    .... 

    free(PAT_DATA_P); 

當我釋放我的指針我得到這個錯誤:

*** glibc detected *** /home/pc-linux/Desktop/Projects/AM_v0.1/Debug/AM_v0.1: free(): invalid pointer: 0xbfffe03c *** 

錯誤所在?

回答

0

分配在堆棧中分配給您的指針下面的行變量的地址:

PAT_DATA_P=&PAT_DATA; 

然後嘗試釋放它!

+0

我在我的代碼中刪除了這一行,並且我只使用了指針並且錯誤消失了。謝謝您的幫助。 – user2096158 2013-02-21 17:00:29

2

你的錯誤是在PAT_DATA_P = &PAT_DATA

PAT_DATA是在棧上分配的線路。

也許你的意思是*PAT_DATA_P = PAT_DATA複製成員,而不是分配指針?

+2

更何況這泄漏內存,因爲你剛剛失去了你的malloc賦值... – 2013-02-21 16:19:27

+0

我也建議在做拷貝之前初始化PAT_DATA的值(但是,我假設發生在你切出的代碼中) – 2013-02-21 16:22:48

0

始終初始化您要創建的變量。這是一個很好的做法。
PAT_DATA沒有在任何時間初始化因此無法使用。

+0

雖然PAT_DATA沒有被初始化,但這並不是用戶引用的錯誤的原因 – 2013-02-21 16:23:51

+0

當運行PAT_DATA_P =&PAT_DATA時,指向先前分配的區域的指針會丟失!那麼如何使用PAT_DATA不是導致錯誤的原因? – lsalamon 2013-02-21 18:14:55