English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

如果我寫
struct test
{
int a ;
char b ;
};

struct test
{
int a ;
char b ;
}*test_ptr ;
如果沒有給值,它是否會佔記憶體空間 ?

2006-08-05 19:20:45 · 5 個解答 · 發問者 ? 4 in 電腦與網際網路 程式設計

真是感謝各位的意見,我覺得 dave 說的比較好,如果大家沒意見的話,我就要選他為最佳解答囉 ^^

2006-08-06 07:23:15 · update #1

Jacob Lee 大大請教一下, 請問 K&R 的書名是什麼 ? 就是 K&R 嗎 ? 因為是 C 創始人寫的,所以想來看看,感謝!

2006-08-09 06:59:11 · update #2

5 個解答

你只是定義了 struct / 一個 struct pointer
C 的規定是:
Global 變數,無論有沒有初值,都佔記憶體(而且佔硬碟!)
Local 變數,在宣告時給初值,佔記憶體;宣告後給初值,不佔。(未對〝佔記憶體〞做詳細定義。)

所以,您的第一個,絕對不佔。
你的第二個,若是 Global ,佔!
若不是,不佔。

2006-08-05 23:47:36 補充:
有些好的 compiler ,在空間最佳化時,會除去未使用的變數。所以,您的 compiler 若好,其實第二個在 Global下〝可能〞也不佔。不過,我用過的 compiler,沒有一個會最佳化 Global 的!Local 的有。

2006-08-06 12:17:55 補充:
既然有人對我『沒詳細定義的〝佔記憶體〞』有意見,只好〝詳〞述了。K & R ( C 語言的發明人) 對void func(void){ int a = 3;}和int func(){ int a;a = 3;}有清楚的定義:前者,a 在 compile 時,就指定了位址,compile 好時,連位址帶初值,save 到〝exe〞檔內!後者,是在 run time 時,才配置 RAM而 Global 變數是〝較難〞在最佳化時確定沒有用到而將之移除,不是〝不能〞。

2006-08-07 20:19:26 補充:
To dave:那是我 N (N>17) 年前讀的,而且我要搬家了,書都封箱了。只能這樣回答你。這裡,我只是提供一種可行的做法,不一定對。照 K&R 的定義,宣告時給初值的變數,〝類似〞static 變數。static 變數〝應該〞是在程式一執行時,就配好位置,並一直〝佔用〞到程式結束。而宣告時有初值的,〝應該〞是在 compile time 時,指定好位址,並將初值存在那位址裡。

2006-08-07 20:19:56 補充:
當時的 compiler 做出來的程式小,而且可以做出 .com 檔。我記得看到那資料時,還寫了小小的程式,分別是在宣告時給 & 不給初值。compile 後,大小真的不同。當然,compiler本身不一定就符合規定。如:各家的compiler都有它非 ANSI / 非 K&R 的 function。有 compiler 這樣做,不代表 ANSI or K&R 的規定就是這樣。

2006-08-13 08:27:13 補充:
Brian W. Kernighan, Dennis M. Ritchie, <>, Prentice-Hall, N.J.

封面:http://ec1.images-amazon.com/images/P/0131103628.01._AA240_SCLZZZZZZZ_.jpg

2006-08-05 19:43:04 · answer #1 · answered by ? 7 · 0 0

剛好也沒這方面的觀念,
也讓我上了一課, thx ^^

2006-08-05 22:56:39 · answer #2 · answered by 榮章 4 · 0 0

第一個不會佔記憶體空間,他只是告訴 compiler 說 "以後要是我打 struct test A 它的內容會是長這樣",這只是一個定義而已,我們沒叫 compiler 真的產生一個 struct test 的東西…

第二個會佔記憶體空間… 因為他是告訴 compiler 說"struct test 的內容長這個樣子,順便幫我留一個空間來放一個指到這個 struct 的指標"… 所以它留的空間是 "指標" 的大小,不是 struct test 本身的大小…

當然,像 Jacob 說的一樣,一個 會作最佳化 處理的 compiler 會看你的程式裡是否有真的用到這個變數 (test_ptr),要是沒有的話,大部分的最佳化的 compiler 會直接把這一段程式拿掉,把它當作它不存在,而自然也就不會幫它留位子了…

要是你把這個變數宣告成 global variable 的話,因為 compiler 很難確定在那麼多的C檔案裡沒有半個會用到它,所以通常是不會 optimize 它…

而要是你把這個變數宣告在一個 function 裡的話,要看看你的所有的 control path 會不會用到它,沒有的話,好的最佳化 compiler 會把它拿掉…

所以並不是像 Jacob 說的,只要有給初始值就會占記憶體空間,也不是先宣告,再設值,就不會佔空間… 基本上,要是你有用到變數,那個變數就會佔到空間,要是沒有,就不會。

例:

int func()
{
int a;
int c = 3 + a;
return c;
}

雖然 a 沒被設初始值,但一樣會被保留記憶體空間,因為整個function的答案決定於c,而c的答案決定於a… (當然,算出來的答案會不確定,因為我沒給初始值)

int func()
{
int a = 3;
int c = 5;
return c;
}
而上面這一個,因為func的答案決定於c,而c的值並不決定於a,所以雖然a有給他一個初始值,一個好的最佳化compiler一樣會把他拿掉,而a就不會佔記憶體空間了

2006-08-06 22:17:00 補充:
可以請 jacob 大大再幫我解釋一下嗎?我下面有點不大懂:local 變數不是定義就是在 function 回傳後會 out-of-scope 嗎?我們以前的 project 是進了 function 後先改 SP,留位子給 local 變數,要是有預設值,SP 改完再設… 這樣,function frame 被清掉時,local variable 跟著不見… 所以不大確定你說有預設值的local 變數是被存在 exe 檔裡意思是?(global 變數我們以前好像的確是設在 .data 區的)

2006-08-05 20:56:07 · answer #3 · answered by Dave 7 · 0 0

第一個不佔記憶體第二個佔記憶體如果沒有給值,它是否會佔記憶體空間 ?答案是會的!

2006-08-05 19:53:48 · answer #4 · answered by ? 5 · 0 0

第一個只是宣告結構,並不會佔用空間
第二個除了宣告以外,會多佔用一個指標長度的空間(因每一種處理器的指標長度不一定,因此無法斷定長度)

2006-08-05 19:41:02 · answer #5 · answered by ㄚ旺 5 · 0 0

fedest.com, questions and answers