Re: [問題] auto宣告的記憶體問題

看板C_and_CPP作者 (好人超)時間12年前 (2012/01/19 15:16), 編輯推噓3(3014)
留言17則, 5人參與, 最新討論串2/4 (看更多)
※ 引述《amozartea (單車單車)》之銘言: : 如題,這可能很少人問過 : 書上寫說區域變數其實都自動預設auto, : 在編譯過程中並不會配置一塊記憶體空間,而是在程式執行時以堆疊的方式存放, : 因此他是屬於動態的變數。 : ^^^^^^^^^^^^^^^^^^^^^^ 此段是出自洪維恩的書 通常區域變數又會稱為「自動變數」 也就是說,它會在函式進入的時候自動配置空間 並且在函式結束的時候自動回收空間 使用者並不必做什麼動作去管理記憶體 但通常不會用「動態」或「靜態」字眼形容區域變數 除非有用static修飾,才會是靜態的 但區域變數不會跟動態兩個字放在一起 : 但是又在動態記憶體章節上面寫說C++都是預設靜態什麼的 很讓人搞混 : ok 總之我目前的認知是一般的陣列是靜態宣告... : (以下都是區域變數) : int a; 跟 auto int a; 等價,而且這是動態 它們都是區域變數,而且等價沒錯 : int a[5]; 是靜態,,,應該吧? 同樣是區域變數 : 那假設我宣告如下(當然是區域): : auto int a[5]; 這到底該算靜態還是動態? 已經試過編譯可以過... 跟 int a[5]; 是等價的。如同上述,這裡並不適合用動態或靜態形容它 : 如果是靜態那不是表示auto關鍵字在這裡沒用嗎@@? : 如果是動態的話那跟 : int* a; a = new int[5];又有何不同 這種寫法稱為「動態配置空間」,其實也沒人在講「動態變數」 總之,我覺得您手邊這本書的名詞非常奇怪...XD 真好奇書上是怎麼講static變數 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 101.13.58.252

01/19 15:17, , 1F
所以應該是我被這本書搞混觀念了= = 謝謝您
01/19 15:17, 1F

01/19 15:18, , 2F
先推在說,我判斷動態的方式是,只要沒new就不是
01/19 15:18, 2F

01/19 15:57, , 3F
static 變數放在哪一般書應該不會探討,但我沒會錯意的
01/19 15:57, 3F

01/19 15:58, , 4F
話,static 似乎是放在 bss (自我修養 p59)
01/19 15:58, 4F

01/19 15:59, , 5F
(所以 static 不是放在 stack,也不是放在 heap)
01/19 15:59, 5F
印象中,有沒有設定初始值的static變數,會被放在不同的地方(data或bss) (?)

01/19 16:05, , 6F
這是我納悶的地方,目前 static 變數即使不給初值給自動
01/19 16:05, 6F

01/19 16:06, , 7F
以0(or NULL)當初值,有什麼static變數是不會給初值的?
01/19 16:06, 7F

01/19 16:07, , 8F
如果都會給初值的話,不就必放在 bss ?
01/19 16:07, 8F

01/19 16:11, , 9F
sorry,我想到答案了,上述錯誤不少。
01/19 16:11, 9F

01/19 16:11, , 10F
沒給初始或初值給0是放在bss,其餘給初值放在data.
01/19 16:11, 10F
實驗了一下 int main() { static int x; } text data bss dec hex filename 62 0 4 66 42 test.o int main() { static int x = 10; } text data bss dec hex filename 62 4 0 66 42 test.o int main() { static int x = 0; } text data bss dec hex filename 62 0 4 66 42 test.o

01/19 17:37, , 11F
靜態 自動 動態
01/19 17:37, 11F

01/19 17:39, , 12F
中間插話好像跟不到進度,算了,名詞還是用英文表示比較準
01/19 17:39, 12F
真的,寫成中文讓我覺得好混亂 ※ 編輯: james732 來自: 101.13.58.252 (01/19 17:41)

01/19 17:42, , 13F
我再補充兩行話好了,以我自己的觀點而言,
01/19 17:42, 13F

01/19 17:43, , 14F
靜態=>static, 自動=>不加字,動態=>用new/malloc
01/19 17:43, 14F

01/19 18:26, , 15F
從沒看過 auto 和 dynamic 放在一起討論的 +1
01/19 18:26, 15F

01/19 18:28, , 16F
static local var 存放的位置基本上和 global var 一樣。
01/19 18:28, 16F

01/19 18:29, , 17F
不然還有哪個地方給你放存活期這麼長的東西...
01/19 18:29, 17F
文章代碼(AID): #1F5yCyk6 (C_and_CPP)
文章代碼(AID): #1F5yCyk6 (C_and_CPP)