日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

require,memcpy( 二 )


細(xì)究這兩個(gè)概念的區(qū)別并不是本文的重點(diǎn),所以這里粗略的對(duì)“淺拷貝”和“深拷貝”做如下區(qū)分,對(duì)于把變量 a 拷貝給 b:如果拷貝后,b 的內(nèi)容完全等于 a,并且兩個(gè)變量在內(nèi)存中是獨(dú)立的,則稱此次拷貝為“深拷貝” 。如果靠背后,只是通過 b 能夠訪問 a 中的內(nèi)容,a 的內(nèi)容改變時(shí),b 的“內(nèi)容”也隨之改變,則稱此次拷貝為“淺拷貝” 。
這樣看來,就本例而言,b = a;顯然是一次“深拷貝”,因?yàn)?a,b 在內(nèi)存中彼此獨(dú)立,并且拷貝后,b 的內(nèi)容和 a 的內(nèi)容完全相同 。那C語言的結(jié)構(gòu)體賦值拷貝一定是“深拷貝”嗎?我們將結(jié)構(gòu)體 s 新增一個(gè)指針成員 buf:對(duì) a 的初始化也做相應(yīng)修改,相關(guān)C語言代碼如下,請(qǐng)看:為了討論主題,上述C語言代碼沒有做錯(cuò)誤處理 。
現(xiàn)在 b = a; 還是“深拷貝”嗎?讀者如果做了實(shí)驗(yàn),應(yīng)該會(huì)發(fā)現(xiàn),b 的 buf 成員本身在內(nèi)存中的確獨(dú)立于 a 的 buf 成員,但是它指向的內(nèi)存卻與 a 的 buf 成員指向的內(nèi)存是同一塊,所以這時(shí) b = a; 不再是純粹的“深拷貝”了 。小結(jié)本節(jié)主要討論了C語言結(jié)構(gòu)體的賦值語法可以用于拷貝,并針對(duì)之前讀者的幾個(gè)典型問題做了較為詳細(xì)的實(shí)例探討 。
不過,C語言是一門非常靈活的編程語言,可能同樣的一條語句,在不同的環(huán)境下執(zhí)行結(jié)果是不一樣的,這一點(diǎn)本文最后的討論就是一個(gè)實(shí)例 。應(yīng)該明白,本文舉的例子僅是為了拋磚引玉,展示遇到問題該如何分析的方法,學(xué)習(xí)C語言,應(yīng)該樂于做實(shí)驗(yàn)嘗試才對(duì) 。歡迎在評(píng)論區(qū)一起討論,質(zhì)疑 。文章都是手打原創(chuàng),每天最淺顯的介紹C語言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦 。
既然有memcpy_s這種安全實(shí)現(xiàn),為啥不禁用危險(xiǎn)的memcpy或者更新memcpy源碼?

require,memcpy


往簡(jiǎn)單了說 就是為了兼容老代碼!也就是此前編寫的代碼 。如果禁用memcpy,那么舊代碼必須進(jìn)行修改,才能在新版本中編譯通過 。而一旦你把舊代碼修改了,在舊的編譯環(huán)境中,又編譯不過了!所以不能禁用 。如果更新memcpy的源碼,可能需要使用到一些新的語言特性之類的,這些新特性可能導(dǎo)致代碼在新舊編譯環(huán)境中的效果出現(xiàn)差異!進(jìn)而出現(xiàn)系統(tǒng)bug!所以也不能輕易的重寫!導(dǎo)致memcpy和memcoy_s共存這樣一個(gè)狀況,最根本的原因,是在早期設(shè)計(jì)這些API的時(shí)候,沒辦法預(yù)見到后續(xù)的問題 。

推薦閱讀