2013-12-18 102 views
0

我基本上試圖從具有用戶輸入數據的結構中取消分配內存,因此目標是擦除數據,以便可以將新數據集重新輸入到結構中。從結構中釋放內存

這是結構

struct packet{ 
    int source; 
    int destination; 
    int type;    // Varibles for the structure 
    int port; 
    char data[50]; 
    char * filename; 
}; 

指針結構

struct packet s[50];   //Array for structure input 
struct packet *p_s; 
p_s = malloc(sizeof(struct packet)); 

其中用戶輸入的數據被添加到變量在結構

printf("\n****Adding a packet*****\n"); 
printf("Where is the packet from?\n"); 
scanf("%i", &s[NetworkPacket].source); 
printf("Where is the packet going?\n"); 
scanf("%i", &s[NetworkPacket].destination); 
printf("What type is the packet?\n"); 
scanf("%i", &s[NetworkPacket].type); // collecting the data of the packet inputted by the user 
printf("What is the packet's port?\n"); 
scanf("%i", &s[NetworkPacket].port); 
printf("Enter up to 50 characters of data.\n"); 
scanf("%s", s[NetworkPacket].data); 

這是怎樣的代碼我查看結構數據

 printf("\n%i\nSource: %d", ii, s[ii].source); 
     printf("\nDestination: %d", s[ii].destination); 
     printf("\nType : %d", s[ii].type);// if statement giving the limit of 50 packets allowed to be added 
     printf("\nPort : %d", s[ii].port); 
     printf("\nData: %s\n---\n", s[ii].data); 

最後的代碼我希望能幫助它從上面刪除一組用戶輸入的數據,這樣就可以添加一個新的集合。

system("cls"); 
free(p_s); 
printf("All the data entered has been cleared. Press any key to continue"); 
+3

一般來說,你只需要在''malloc''之前使用'free'。 – dreamlax

+0

你只需要釋放你擁有malloc的struct成員。 – moeCake

回答

1

您只需要free(p_s);。您不能一個接一個地分配成員,因爲他們也不是一一分配的。

+0

我試過了,記錄仍然存在,當我查看它們時 –

+0

@NabilAziz:你是如何查看它們的? – dreamlax

+0

我發佈了一個更新,顯示 –

1

如果您想重新使用先前分配的內存。您可以使用memset將所有分配的內存填充到'\ 0'。通過這樣做,您正在重設除char *文件名外的整個strcuture!您需要分配此char *,並獨立於分配或取消分配父結構而取消分配。

+1

你能告訴我我將如何把這個問題作爲一個例子嗎?不知道如何使用memset –

+0

當然!使用memset,您可以將緩衝區的所有字節設置爲特定值。 '
#define BUFFER_LEN 128
char buffer [BUFFER_LEN]; (緩衝區,'\ 0',BUFFER_LEN);' ' –