2013-02-21 50 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