2012-06-20 106 views
0
#include<stdio.h> 
#include<stdlib.h> 
#include<malloc.h> 

#include <math.h> 
typedef struct label{ 

int id; 
double p,*t,q,c; 

int V[45]; 
struct label *next; 
struct label *prev; 
struct path *tail; 
struct path *head; 

    }label; 

typedef struct path{ 
int i; 

struct path *Pperv; 
struct path *Pnext; 
}path; 




void main(){ 

int i,j,k; 
struct label *Current,*FCurrent,*Current2,*Head,*Tail,*FHead,*FTail; 
struct path *cur,*test3,*test2,*test1,*path_head,*path_tail; 

Head=(struct label*)malloc(1*sizeof(struct label)); 
Tail=(struct label*)malloc(1*sizeof(struct label)); 



Head->next=Tail; 
Tail->prev=Head; 

FHead=(struct label*)malloc(1*sizeof(struct label)); 
FTail=(struct label*)malloc(1*sizeof(struct label)); 

FHead->next=FTail; 
FTail->prev=FHead; 



for (i=0;i<250000;i++) 
{ 
    //printf("%d",i); 
    Current=(struct label*)malloc(1*sizeof(struct label)); 
    Current->t=(double*)malloc(15*sizeof(double)); 

    Current->head=(struct path*)malloc(1*sizeof(struct path)); 
    Current->tail=(struct path*)malloc(1*sizeof(struct path)); 
    Current->head->Pnext=Current->tail; 
    Current->tail->Pperv=Current->head; 

    for (j=0;j<15;j++) 
    { 
     test1=(struct path*)malloc(1*sizeof(struct path)); 

     test1->Pperv=Current->head; 
     test1->Pnext=Current->head->Pnext; 

     Current->head->Pnext->Pperv=test1; 
     Current->head->Pnext=test1; 


     test1->i=1; 
     Current->t[j]=23123.43; 

    } 
    if (i % 4!=0) 
    { 
    Current->next=Tail; 
    Current->prev=Tail->prev; 
    Tail->prev->next=Current; 
    Tail->prev=Current; 
    Current->p=54545.323241321; 
    } 
    else 
    { 


    Current->next=FTail; 
    Current->prev=FTail->prev; 
    FTail->prev->next=Current; 
    FTail->prev=Current; 


    } 
} 



Current=Head->next; 
while(Current->next!=Tail) 
{ 

    Head->next->next->prev=Head; 
    Head->next=Head->next->next; 

    test1=Current->head->Pnext; 
    while(test1!=Current->tail) 
     { 
      test2=test1; 
      test1=test1->Pnext; 
      free(test2); 


     } 

    free(Current->t); 
    free(Current->head); 
    free(Current->tail); 
    free(Current); 
    Current=Head->next; 
} 


Current=FHead->next; 
while(Current->next!=FTail) 
{ 

    FHead->next->next->prev=FHead; 
    FHead->next=FHead->next->next; 
    k=0; 
    test1=Current->head->Pnext; 
    while(test1!=Current->tail) 
     { 

      test2=test1; 
      test1=test1->Pnext; 
      free(test2); 
      k++; 


     } 

    free(Current->t); 
    free(Current->head); 
    free(Current->tail); 
    free(Current); 
    Current=FHead->next; 
} 







} 

我試驗了以下問題。這不是我真正的問題,它只是我創建的一個例子,爲的是讓問題更容易被查看。正如你在這個例子中看到的那樣,我有兩個結構,一個在另一個裏面,例子的作用是創建類型爲label的新結構,並用指針FHead和FTail將它們放入列表中的3次,在指針Head和Tail的列表中4次。問題是,當我嘗試釋放結構時,它不會發生,語法是100%正確的,因爲當我將所有結構保存在兩個列表中的一箇中時,費用函數工作得很好。這導致了我使用指針時發生錯誤的結果,不幸的是,我是C中的新成員,所以我不太清楚整個指針是如何去做的。所以如果有人能夠解釋使用指針時出現了什麼問題,我應該非常感謝,並且我應該如何在ordr中創建特定的列表以使frre函數正常工作。 預先感謝您...嘗試釋放C中的結構時出現問題

+2

你的問題確實是未stackoverflowish。嘗試發佈簡單,簡潔,儘可能直接的代碼,並進行適當的評論。 另外,請問同樣客觀的問題,並只發布相關信息。 –

+0

你是什麼意思「當我嘗試釋放結構時,它不會發生」?你期望會發生什麼,你如何看待免費沒有發生? – TJD

+0

不知道爲什麼你懶得做typedefs但不使用它們? –

回答

0

您的代碼很難閱讀,因爲您只有很長的功能,並且發生許多事情。即使是有經驗的C也很難閱讀,所以C初學者一定很難。如果您將此功能分成更小,更專業的功能,則可能更容易理解並發現錯誤。

在旁註中(即使錯誤可能不是來自這裏,不這樣做是非常糟糕的做法):每次調用malloc時,都必須檢查它是否失敗。 Malloc可能無法給你一些內存,在這種情況下它會返回NULL。例如:

test1=(struct path*)malloc(1*sizeof(struct path)); 

可能成爲

test1 = (struct path*)malloc(1*sizeof(struct path)); 
if (test1 == NULL) { 
    abort(); /* Makes the program stop abruptly */ 
} 

如果不檢查,並得到一個空的結果,你的程序將有一個奇怪的行爲;這些錯誤很難找到。

編輯:由意見的建議,一個更好的風格是做

test1 = malloc(sizeof(path)); 
if (test1 == NULL) { 
    abort(); /* Or something else that makes sense */ 
} 
+0

順便說一句,不會將malloc轉換爲指針產生任何麻煩的效果? –

+0

@AndréSantosdeMedeiros對於由malloc返回的void *指針轉換爲其他類型的指針,您會期望什麼樣的「麻煩效果」? –

+0

我真的不知道。我不編程C++,幾乎不用投射malloc void指針! –

相關問題