[爆卦]C free char是什麼?優點缺點精華區懶人包

為什麼這篇C free char鄉民發文收入到精華區:因為在C free char這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者IhateOGC (我討厭)看板C_and_CPP標題[問題] 需要free const *ch...


開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
C
GCC
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
NO
問題(Question):
建立了一個struct myStruct Table[]={
{1 , "OGC_0701"},
{2 , "OGC_0702"},
};

1 .程式整個run完之後需要 free Table嗎?
2. 需要對齊嗎? struct size = 5 gcc不支援#pragma (1)該怎對齊?

餵入的資料(Input):
當筆數越來越多的時候...

預期的正確結果(Expected Output):
使用完必須Free乾淨還給使用者記憶體:D

struct myStruct {
int index;
char *string;
};

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 203.77.53.191
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1406726869.A.ADB.html
※ 編輯: IhateOGC (203.77.53.191), 07/30/2014 21:30:53
※ 編輯: IhateOGC (203.77.53.191), 07/30/2014 21:31:40
loveme00835:有 malloc() calloc() realloc() 才有 free() 07/30 21:31
loveme00835:不然照你的邏輯 int a; int* pa = &a; 也要 free() 了 07/30 21:31
但是字串是 const *char Q_Q!!
※ 編輯: IhateOGC (203.77.53.191), 07/30/2014 21:34:29
loveme00835:所謂的字串定義是 "一連串的字元用來描述文字並且以 07/30 21:37
loveme00835:'\0'做為結尾" 你不管是 char* 還是 const*char 還是 07/30 21:38
loveme00835:const char* 都只是 "指標" 而已不是字串! 07/30 21:38
loveme00835:照你的定義, int a; char* str = (char*)&a; 抓隻貓也 07/30 21:40
loveme00835:可以拿來當字串了.. 指標指向的記憶體怎麼來的才是重 07/30 21:40
loveme00835:點, 程式裡面寫 char* str = "hello"; 是編譯器要負責 07/30 21:41
loveme00835:在執行時期要存在一塊記憶體讓你的指標指, 但是並沒有 07/30 21:42
loveme00835:發生動態記憶體配置, str 也不是字串, 是指標. 不管你 07/30 21:42
loveme00835:const 加在哪邊, 還是加在錯的地方, 所謂的字串是指一 07/30 21:43
loveme00835:塊記憶體內的值, 不是指標. 07/30 21:43
原來如此Q_Q!

但是該如何free *str指向的記憶體呢? 還是說程式結束也會自己free掉?

-這類字串結構 程式用測試工具重複跑幾萬次後會crash掉嗎@@?
※ 編輯: IhateOGC (203.77.53.191), 07/30/2014 21:49:30
loveme00835:那是編譯器實作者才該思考的問題, 記住一樓推文就好. 07/30 21:48
loveme00835:通常這種 string literal 存在愈多, 你編譯出來的執行 07/30 21:50
loveme00835:檔愈肥大, 那些記憶體就類似 static 變數給你指 07/30 21:51
感謝大大!!

還有...請問需要對齊嗎? 我常常用指標

最近看到struct size不是 4的倍數會有對齊的BUG 需要用pragma(size)去對齊

但是linux下gcc說不支援 Q_Q!
※ 編輯: IhateOGC (203.77.53.191), 07/30/2014 21:55:11
loveme00835:struct size 不是 4的倍數 錯了嗎? 07/30 21:59

以一個struct size 5的元素來說

int *int_ptr = &mystruct.index; (size 4)
char **char_ptr = &mystruct.string;(size 5)
http://blog.xuite.net/jackie.xie/bluelove/7788211

ps.因為我同樣的code也要讓客戶能在Window上跑@@
※ 編輯: IhateOGC (203.77.53.191), 07/30/2014 22:06:29
loveme00835:你上面兩行跟size無關阿! 除非你現在有client code會 07/30 22:11
loveme00835:存取struct物件, 才需要兩邊都用同樣的memory layout 07/30 22:12
loveme00835:不然 default 就好, 讓編譯器決定它覺得較快的存取方 07/30 22:12
loveme00835:式, 不然你用不同編譯器各自跑在不同平台上, 07/30 22:13
loveme00835:從 primitive type 的 memory layout 就要開始錙銖必 07/30 22:14
loveme00835:較了, gcc 要 pack 也行, 用 __attribute__ 07/30 22:15

你可能也想看看

搜尋相關網站