1. 程式人生 > >關於結構體記憶體分配及釋放

關於結構體記憶體分配及釋放

struct mybuf{
  int size;
  char buffer[1];
}

為什麼要這樣定義結構?char[1]只能放/0,如何放資料
再看使用
bufsize=1024;
struct mybuf *mbuf = (struct mybuf *)malloc(sizeof(struct mybuf)+ bufsize +1);
strcpy(mbuf.buffer, "this is test");
[問題]這樣做是不是會陣列越界,另外在釋放此空間的時候,因為是結構體指標,如果按結構體空間釋放,那豈不是記憶體洩漏?

過去做C的時候也這麼寫過,特別是在操作訊息佇列時經常這麼用,這麼做可以擴充套件結構體中緩衝區buffer的大小
如你的程式碼,實際buffer分配的是1024,只在使用的時候才動態分配,而只保留結構體的指標,釋放時只需釋放結構體指標就可以了
另外解析一下這樣做為什麼不會記憶體洩漏
首先要了解malloc/free的機制
malloc其實分配了比你申請的大小更大一點的空間,那這大出來的是做什麼的呢,是用來存放分配記憶體塊的資訊,包括了空間大小資訊,而free是怎麼做的呢,它先根據你傳入的指標,計算出塊的實際首地址,通過(-sizeof(塊資訊結構))得到的,把塊的狀態置為可用,這就是free的簡單過程,那麼你就明白,分配的時候是按malloc函式引數的申請大小,不是結構體的大小,那麼在釋放的時候就是釋放malloc分配的大小了,而不是結構體的大小