[爆卦]memset清空是什麼?優點缺點精華區懶人包

為什麼這篇memset清空鄉民發文收入到精華區:因為在memset清空這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者lungswu (宅爸爸)看板C_and_CPP標題[問題] UNION initial問題時間...


開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++ (使用C語法)

額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
NONE

問題(Question):
於GCC中,要於宣告union時同時做initial的作法為

1 typedef union {
2 char c0;
3 short s0;
4 char c[10];
5 } UU;
6
7 typedef struct {
8 char a;
9 UU b;
10 } SS;
11
12 int main (void)
13 {
14
15 SS b = {'a', {.s0 = 2}};
16
17 return 0;
18 }
19

那請問各位高手,於VC中要如何做?

餵入的資料(Input):


預期的正確結果(Expected Output):


錯誤結果(Wrong Output):


程式碼(Code):(請善用置底文網頁, 記得排版)


補充說明(Supplement):
這邊只能用C語法,不用C++語法

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 134.122.249.1
purpose:http://codepad.org/P19KdUTk 09/08 19:45
lungswu:感謝樓上,但如果考慮cross platform,就不好維護。 09/08 22:51
lungswu:不知ANSCI C有無類似這種定義? 09/08 22:51
purpose:你用的是 C99 的東西,VC不支援,要換平台還是用 gcc 吧 09/08 22:56
purpose:另外不知你在宣告時同時初始化的目的為何?是為了方便,還 09/08 22:57
purpose:是不得不如此,有範例嗎 09/08 22:57
lungswu:應該說我用的是VS2005/2008,他沒有支援C99,印象中我的範 09/08 23:24
lungswu:是GCC擴充的。 09/08 23:24
lungswu:另外我這樣做是為了不用再寫冗長的code做初始化,用一個 09/08 23:26
lungswu:看起來像table的東西來表示。 09/08 23:27
lungswu:P大說的還真沒錯,這是C99的一部份 09/08 23:40
angleevil:使用vc2010看看,其實也可以memset. 09/09 09:25
lungswu:Compiler不是我可以控制的,所以我只能從C99的標準下手。 09/09 10:06
lungswu:我意思是說:我寫的code會再不同環境執行。所以盡量不要寫 09/09 10:07
lungswu:得很奇怪,且要好維護,又要注重執行效率。 09/09 10:09
angleevil:那就用memset來初始化. 09/09 11:11
lungswu:請問A大指的memset是否為 09/09 13:00
lungswu:void *memset(void *b, int c, size_t len); 09/09 13:00
angleevil:恩,不過通常是用來給0值.因為它是塞值到每個位元上 09/09 14:08
angleevil:memset(SS,0x00,sizeof(UU));<--我的習慣是都給0 or -1 09/09 14:12
Favonia:想要可攜 memset 請不要用 -1 xD 09/09 15:36
angleevil:我幾乎是用0喔,-1只用過一次.那次是不得已(扭) 09/09 15:50
lungswu:感謝各路專家提供意見,看來是無解了。我也離題吧:) 09/09 18:51
lungswu:祝各位中秋節快樂 09/09 18:52
lungswu:但若要初始值全部為0,將SS設成global variable就可以了, 09/09 18:53
lungswu:因為loader會將global全部清除為0。 09/09 18:54
lungswu:這樣就省了memset的時間,但處理global variable時要小心 09/09 18:55
Favonia:嚴格來說這樣沒有到達理論上可攜,因為union可能只有初始 09/09 20:39
Favonia:化第一個 member 其他剩下垃圾。 09/09 20:40
Favonia:你用的語法就是要漂亮的解決上面的窘境(只初始化第一個) 09/09 20:46
Favonia:現在不能用了我想應該沒有超漂亮的解 xD 09/09 20:48
lungswu:但是,以實際上的例子,將SS設成global variable且沒有賦 09/10 00:05
lungswu:宇初始值,structure中所佔的全部記憶體都會清為0。 09/10 00:06
Favonia:我講的是全域變數。記憶體清空並不是可攜的概念;例如空指 09/10 00:14
Favonia:標非零的機器上指標會變成空指標(但不是零),然後struct 09/10 00:14
Favonia:每一個成員都會「清空」沒錯,但 union 只會清空第一個。 09/10 00:15
Favonia:如果你想尋求 C99 的話,可以看 N1256 6.7.8p10 09/10 00:18
Favonia:(精神上是清空沒錯啦,但不是記憶體清空(歸零)xD) 09/10 00:21

你可能也想看看

搜尋相關網站