→ 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