[問題] 需要free const *char 嗎?

看板C_and_CPP作者 (我討厭)時間11年前發表 (2014/07/30 13:27), 11年前編輯推噓0(0022)
留言22則, 1人參與, 最新討論串1/1
開發平台(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

07/30 21:31, , 1F
有 malloc() calloc() realloc() 才有 free()
07/30 21:31, 1F

07/30 21:31, , 2F
不然照你的邏輯 int a; int* pa = &a; 也要 free() 了
07/30 21:31, 2F
但是字串是 const *char Q_Q!! ※ 編輯: IhateOGC (203.77.53.191), 07/30/2014 21:34:29

07/30 21:37, , 3F
所謂的字串定義是 "一連串的字元用來描述文字並且以
07/30 21:37, 3F

07/30 21:38, , 4F
'\0'做為結尾" 你不管是 char* 還是 const*char 還是
07/30 21:38, 4F

07/30 21:38, , 5F
const char* 都只是 "指標" 而已不是字串!
07/30 21:38, 5F

07/30 21:40, , 6F
照你的定義, int a; char* str = (char*)&a; 抓隻貓也
07/30 21:40, 6F

07/30 21:40, , 7F
可以拿來當字串了.. 指標指向的記憶體怎麼來的才是重
07/30 21:40, 7F

07/30 21:41, , 8F
點, 程式裡面寫 char* str = "hello"; 是編譯器要負責
07/30 21:41, 8F

07/30 21:42, , 9F
在執行時期要存在一塊記憶體讓你的指標指, 但是並沒有
07/30 21:42, 9F

07/30 21:42, , 10F
發生動態記憶體配置, str 也不是字串, 是指標. 不管你
07/30 21:42, 10F

07/30 21:43, , 11F
const 加在哪邊, 還是加在錯的地方, 所謂的字串是指一
07/30 21:43, 11F

07/30 21:43, , 12F
塊記憶體內的值, 不是指標.
07/30 21:43, 12F
原來如此Q_Q! 但是該如何free *str指向的記憶體呢? 還是說程式結束也會自己free掉? -這類字串結構 程式用測試工具重複跑幾萬次後會crash掉嗎@@? ※ 編輯: IhateOGC (203.77.53.191), 07/30/2014 21:49:30

07/30 21:48, , 13F
那是編譯器實作者才該思考的問題, 記住一樓推文就好.
07/30 21:48, 13F

07/30 21:50, , 14F
通常這種 string literal 存在愈多, 你編譯出來的執行
07/30 21:50, 14F

07/30 21:51, , 15F
檔愈肥大, 那些記憶體就類似 static 變數給你指
07/30 21:51, 15F
感謝大大!! 還有...請問需要對齊嗎? 我常常用指標 最近看到struct size不是 4的倍數會有對齊的BUG 需要用pragma(size)去對齊 但是linux下gcc說不支援 Q_Q! ※ 編輯: IhateOGC (203.77.53.191), 07/30/2014 21:55:11

07/30 21:59, , 16F
struct size 不是 4的倍數 錯了嗎?
07/30 21:59, 16F
以一個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

07/30 22:11, , 17F
你上面兩行跟size無關阿! 除非你現在有client code會
07/30 22:11, 17F

07/30 22:12, , 18F
存取struct物件, 才需要兩邊都用同樣的memory layout
07/30 22:12, 18F

07/30 22:12, , 19F
不然 default 就好, 讓編譯器決定它覺得較快的存取方
07/30 22:12, 19F

07/30 22:13, , 20F
式, 不然你用不同編譯器各自跑在不同平台上,
07/30 22:13, 20F

07/30 22:14, , 21F
從 primitive type 的 memory layout 就要開始錙銖必
07/30 22:14, 21F

07/30 22:15, , 22F
較了, gcc 要 pack 也行, 用 __attribute__
07/30 22:15, 22F
文章代碼(AID): #1JsFBLhR (C_and_CPP)