第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

具體來說,拋出malloc的結(jié)果有什么危險(xiǎn)?

具體來說,拋出malloc的結(jié)果有什么危險(xiǎn)?

C
慕桂英4014372 2019-06-03 16:11:09
具體來說,拋出malloc的結(jié)果有什么危險(xiǎn)?現(xiàn)在,在人們開始將其標(biāo)記為DUP之前,我已經(jīng)閱讀了以下所有內(nèi)容,但都沒有給出我想要的答案:常見問題:拋出malloc的返回值有什么問題?所以:我應(yīng)該顯式地轉(zhuǎn)換malloc()的返回值嗎?所以:C中不必要的指針轉(zhuǎn)換那么:我投馬洛的結(jié)果嗎?上述問題的常見問題和許多答案都提到了一個(gè)神秘的錯(cuò)誤:malloc其返回值可以隱藏;但是,在實(shí)踐中,它們都沒有給出這樣一個(gè)錯(cuò)誤的具體例子。誤差,不是警告.現(xiàn)在給出以下代碼:#include <string.h>#include <stdio.h>// #include <stdlib.h>int main(int argc, char** argv) {     char * p = /*(char*)*/malloc(10);     strcpy(p, "hello");     printf("%s\n", p);     return 0;}使用GCC 4.2編譯上述代碼,附帶和不帶強(qiáng)制轉(zhuǎn)換,發(fā)出相同的警告,程序正確執(zhí)行,并在兩種情況下提供相同的結(jié)果。anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc nostdlib_malloc.c: In function ‘main’:nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function  ‘malloc’anon@anon:~/$ ./nostdlib_malloc  hello因此,任何人是否可以給出編譯或運(yùn)行時(shí)錯(cuò)誤的特定代碼示例,這些錯(cuò)誤可能因轉(zhuǎn)換而發(fā)生。malloc回報(bào)的價(jià)值,還是這只是一個(gè)城市的傳說?編輯在這個(gè)問題上,我遇到了兩個(gè)很好的書面論點(diǎn):贊成鑄造:證書咨詢:立即將內(nèi)存分配函數(shù)調(diào)用的結(jié)果轉(zhuǎn)換為指向分配類型的指針。反鑄造(截至2012-02-14的404錯(cuò)誤:使用互聯(lián)網(wǎng)檔案回傳機(jī){2016-03-18:“由于robots.txt不能爬行或顯示頁”)
查看完整描述

4 回答

?
MMMHUHU

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊

你不會(huì)得到編譯器錯(cuò)誤,但是編譯器警告..正如你引用的消息來源(特別是第一次),你能,會(huì),可以變幻莫測(cè)運(yùn)行時(shí)錯(cuò)誤當(dāng)使用石膏時(shí)不包括stdlib.h.

所以你這邊的錯(cuò)誤不是演員,而是忘了包括stdlib.h..編譯器可能會(huì)假設(shè)malloc是一個(gè)函數(shù)返回int,因此轉(zhuǎn)換void*實(shí)際返回的指針mallocint然后,由于顯式轉(zhuǎn)換,指向指針類型。在一些平臺(tái)上,int指針可能占用不同的字節(jié)數(shù),因此類型轉(zhuǎn)換可能導(dǎo)致數(shù)據(jù)損壞。

幸運(yùn)的是,現(xiàn)代編譯器會(huì)發(fā)出指向?qū)嶋H錯(cuò)誤的警告。見gcc輸出:它警告您隱式聲明(int malloc(int))與內(nèi)置的malloc..所以gcc似乎知道malloc即使沒有stdlib.h.

為了防止這一錯(cuò)誤,省略強(qiáng)制轉(zhuǎn)換與編寫基本相同的推理。

if (0 == my_var)

而不是

if (my_var == 0)

因?yàn)楹笳呖赡軙?huì)導(dǎo)致嚴(yán)重的錯(cuò)誤,如果一個(gè)人會(huì)混淆===,而第一個(gè)則會(huì)導(dǎo)致編譯錯(cuò)誤。我個(gè)人更喜歡后一種風(fēng)格,因?yàn)樗玫胤从沉宋业囊鈭D,而且我不傾向于做這個(gè)錯(cuò)誤。

返回的值的轉(zhuǎn)換也是相同的。malloc:我更喜歡在編程中顯式化,并且我通常會(huì)反復(fù)檢查以包含我使用的所有函數(shù)的頭文件。


查看完整回答
反對(duì) 回復(fù) 2019-06-03
?
莫回?zé)o

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊

假設(shè)非原型函數(shù)返回。int.

所以你選了一個(gè)int指向一個(gè)指針。如果指針比int在你的平臺(tái)上,這是非常危險(xiǎn)的行為。

另外,當(dāng)然,有些人會(huì)考慮警告錯(cuò)誤,即代碼應(yīng)該在沒有錯(cuò)誤的情況下編譯。

就我個(gè)人而言,我認(rèn)為你不需要void *另一種指針類型是C中的一個(gè)特性,并考慮那些確實(shí)被破壞的代碼。


查看完整回答
反對(duì) 回復(fù) 2019-06-03
?
慕村9548890

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊

如果在64位模式編譯時(shí)執(zhí)行此操作,則返回的指針將被截?cái)酁?2位。

編輯:抱歉太簡(jiǎn)短了。下面是一個(gè)用于討論的示例代碼片段。

main()
{
   char * c = (char *)malloc(2) ;
   printf("%p", c) ;
}

假設(shè)返回的堆指針大于int中可表示的值,例如0xAB00000000。

如果malloc不是返回指針的原型,則返回的int值最初將在具有所有有效位集的某個(gè)寄存器中?,F(xiàn)在編譯器會(huì)說,“好的,如何將int轉(zhuǎn)換為指針”。這將是一個(gè)符號(hào)擴(kuò)展或零擴(kuò)展的低階32位,它已經(jīng)告訴malloc“返回”,省略原型。由于int是簽名的,我認(rèn)為轉(zhuǎn)換將是符號(hào)擴(kuò)展,在本例中將值轉(zhuǎn)換為零。如果返回值為0xABF0000000,您將得到一個(gè)非零指針,在嘗試取消引用時(shí)也會(huì)帶來一些樂趣。


查看完整回答
反對(duì) 回復(fù) 2019-06-03
  • 4 回答
  • 0 關(guān)注
  • 505 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)