contributed by < yichung279 >
sysprog2018
ref: https://openhome.cc/Gossip/CGossip/
這些規範不在規格書中,再 ieee754 及其他標準,這也保持了架構的靈活性。
沒有「雙重指標」這說法,請依據 C 語言規格書,只有 the pointer to the pointer
jserv
善用 GDB,你可以直接傾印特定記憶體區間的內容,並用 macro 來客製化輸出
jserv
C是為了寫 Unix 而生的語言,而且可以自己編譯自己,先從從C 語言的子集合 C0 開始, C0 產生 C1 ,以此類推,一步步擴充規範。 C0 編譯器以組合語言開發。 見: bootstraping
C0 有的關鍵字:
直播中看到的疑問:
=
兩邊的值,規格書中6.3.2.1:
The name ‘‘lvalue’’ comes originally from the assignment expression E1 = E2,…
[]
是pointer to object type 的 postfix,如 pointer to int,而str其實是 an array object ( a pointer to the initial element of an array object )我不太理解這裡的 E1 到底是什麼,翻來翻去結果是 pointer to element (所以可以做指標運算)又是 array type (所以 E1 是lvalue 時,不能做modifiable value),導致 E1++ 不合法,但 E1+1合法。
所以 E1 是 pointer ,但是 array type 讓他行為不同嗎?而其他的pointer 會有 type嗎?(但pjchiou的共筆指 E1 不是指標,所以不能 E1++,有點困惑)
array subscripting 限制了可用的 operator,請回頭看規格書 6.5.2 並且對照 gcc 編譯錯誤訊息
6.5.2 第三點指出:
[]
會把 E1 轉換成不能做lvalue的pointerYichung
提及他人共筆時,應該述及 ID 或其他識別資訊。
jserv
E1[E2] is identical to(*((E1)+(E2)))
compiler and debugger。
void *
之謎:指標操作有相關的風險,例如:用 "指向比較小 object 的 pointer" 指向 比較大的 object ,而導致不如預期的行為。
因為透過 void*
無法直接被存取的特性,我們便能保護 object。
危險:
直接不給過:
另有優點:
stack overflow 的討論中,提及'void
is nothing, void*
is everything',作為function parameter時,很有靈活性。
文字訊息不要用圖片來展現,一來很難搜尋 (和複製貼上),二來視覺障礙的朋友無法觀看,自然無法跟你交流討論
jserv
透過 address ,我們可以輕易地在 A function 修改 B function 的 object ,而如果這個object是pointer時,就需要pointer to pointer 了。
待研讀:
Uno: 跟 cache line 有關 , column major 較容易會洗掉原本的 cache 內容
ref:cenalulu的文章
syntax sugar
物件占了一定的空間,型態決定這些空間怎麼表示。
strcpy/strcat:使用到不該使用的記憶體,就會發生問題了。
cat:concatenate。
malloc:會失敗,失敗跟配置0都會回傳null
C語言把大家當成成熟的大人–––宅色夫
argv有點可怕
延伸:python有argv嗎?有,sys.argv 為什麼還要有argparse?因為有人的程式很複雜 argv不夠用
但經實驗sys.argv 跟argparse的速度差了三個數量級
附上實驗方法和數據,理工人說話要精準
jserv
在我的筆電上,輸入一個環境參數,argv大約使用了0.000006s,argparser 約需要0.004s,一直想用程式做更大規模的實驗,有機會會補上完整數據。yichung279
num 與 2.0 即為 引數 (Argument),或稱為 函式引數 (Argument of a Function)。
i 與 f 則為 參數 (Parameter)。
function designator ,因為不是搭配 &, sizeof 使用,所以會被轉成為 pointer to function
就算 ***fptr,再多的 * 都鞥function designator。
int *func1()
int *func2()
""
會使用 static area 中的記憶體,進行 string literal,[] 會把上述的結果複製至stack中。
而func2() 指向的 array 在 func2 生命週期結束時,一起被釋放了,所以 func2() return值 便指向了 null。
但fun1() 指向 static area 裡的空間,func1生命週期結束後依然存在,所以 func1() return值 依然指向字串。
詭異的事:一開始程式打錯 char 打成 int ,func1() 仍印出 "hello world"。
於是試圖做以下實驗:
gdb :
whatis func():type = int
x func(): 0x12345678
p func(): 305419896
難以理解一個 int type ,有 unsigned long 的行為。一個 object 不是以 type 決定 expression 嗎?
function call 不能以 object 觀點檢視?(待我看完函式篇
後來做到 big-endian / little-endian 的題目就懂了。-yichung279
OSX把 /n
拿掉會多印一位,GNU/linux不會多印,online compiler不會多印,為何有不同的行為,為何不是印到OS介入為止。(UB?)
main printf 本身就是 function,涉及func call
呼叫標準函式庫,涉及linking
before main
memory layout