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

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

請問malloc怎么也初始化地址為0??free(A)只釋放A[0] realloc也有問題???有截圖

請問malloc怎么也初始化地址為0??free(A)只釋放A[0] realloc也有問題???有截圖

asdhjhg 2017-05-15 15:33:33
請問malloc怎么也初始化地址為0??free(A)只釋放A[0] realloc增加的內(nèi)存地址第一個(gè)是隨機(jī)的后面都是初始化0???有截圖malooc和calloc初始化肯定不一樣啊,一個(gè)隨機(jī)的比如分配的地址是 -17891602,而calloc是初始化為0的 地址應(yīng)該是 0,不明白上面怎么執(zhí)行的不對?free的問題,難道是因?yàn)橹羔楢返回的value是內(nèi)存中第一個(gè)地址的緣故?所以free只在第一個(gè)地址位置隨機(jī)分配?我感覺整個(gè)人都不好了。。。。。還有realloc也是這問題,增加了雙倍內(nèi)存,然后增加部分的內(nèi)存第一個(gè)地址是隨機(jī)的,后面都是0 郁悶?。。。〈笊駚砭任遥。?!#include?<stdio.h> #include?<stdlib.h> int?main() { ??int?n; ??printf?("Enter?size?of?array\n"); ??scanf("%d",&n); ??int?*A?=?(int*)calloc(n,sizeof(int)); ??/* ??for(int?i=0;?i<n;?i++) ??{ ????A[i]?=?i+1; ??} ??free(A); ??*/ ??//A?=?NULL;//It?is?a?good?practice?to?set?pointer?address?as?NULL?after?call?to?free.?NULL?is?a?macro?for?address?0?is?and?it?cannot?be?dereferenced.?The?code?below?this?statement?will?now?cause?a?crash. ??for(int?i=0;?i<n;?i++) ??{ ????printf?("%d\n",?A[i]); ??} }
查看完整描述

1 回答

已采納
?
onemoo

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

不要混淆了“地址”和“地址中的內(nèi)容”,這是兩碼事!

把內(nèi)存當(dāng)作“一連串的房間”的話,“內(nèi)存地址”是房號(hào),而“地址中的內(nèi)容”是房間里的東西。指針類型中存儲(chǔ)的就是地址。

  • “malloc怎么也初始化地址為0?”

    malloc 會(huì)分配一段指定大小的內(nèi)存,但不會(huì)初始化其中的內(nèi)容,或者說其中的值是隨機(jī)的。

    第 1 張圖中你用 malloc 分配了 10 個(gè) int 大小的空間,你可以把這段空間當(dāng)作是 int A[10] 數(shù)組。然后你打印了這個(gè)“數(shù)組A”中的 10 個(gè)元素的值。

    在你這個(gè)結(jié)果中,碰巧這 10 個(gè)元素的值都是 0。 注意是“地址中的值為 0”,不是“地址為 0”。

    還有,不要因?yàn)榭吹蕉际?0 就覺得“malloc 難道也會(huì)將分配的地址中的值初始化為 0???”,這只是碰巧了而已。

  • 第 2 張圖中,你用?calloc 分配了 10 個(gè) int 大小的空間。和 malloc 不同,calloc 會(huì)將其內(nèi)容初始化為 0。

    所以這次打印出的內(nèi)容肯定都是 0 。

  • 第 3 張圖,free(A) 并非只釋放 A[0]。 free 釋放的就是 A 指針?biāo)傅?、之前?malloc 所分配到的全部內(nèi)存。重要的一點(diǎn)是:free 一個(gè)指針之后,再訪問該指針的結(jié)果是未定義的!

    所以不要再通過 A 測試那些內(nèi)存中的值了,它們可能是任何值。

    記?。阂坏?free 了某個(gè)指針,除非再給該指針賦予有意義的新地址,否則不要再按照原值使用該指針了。

  • 第 4 張圖,realloc 會(huì)“重分配”之前分配到的內(nèi)存,同時(shí)調(diào)整內(nèi)存的大小,并且盡可能保留原內(nèi)存中的值。當(dāng)新內(nèi)存大于原內(nèi)存時(shí),多出來的內(nèi)存中的值是未定義的,也就是說多出來的內(nèi)存中的值是隨機(jī)的。

    所以你的結(jié)果中,多出來的 135145、0、0、0、0 都是隨機(jī)值。和前面的例子一樣,只不過是碰到 0 比較多而已,并非是“后面初始化為 0”。

    另外說一下:其實(shí) realloc 并不保證新內(nèi)存肯定在原內(nèi)存的位置上分配,它只保證新內(nèi)存中保留原內(nèi)存中的值。 在你的這個(gè)例子中,你打印了 A 和 B 的值,你可以看到它們確實(shí)是同一個(gè)地址,也就是說這一次 realloc 確實(shí)是在原內(nèi)存位置上分配新內(nèi)存的。


其實(shí)你不用想這么多。在初學(xué)階段,你只要記住這些函數(shù)的行為,然后按照它們的規(guī)則使用這些函數(shù)即可。尤其是對于那些“未定義行為”,記住永遠(yuǎn)不要寫依賴于“未定義行為”的代碼就好了。 當(dāng)看到了“未定義行為”,初學(xué)時(shí)不用絞盡腦汁想“為什么是這樣的呀??”,因?yàn)?C 語言標(biāo)準(zhǔn)已經(jīng)告訴你了這些行為是未定義的,所以出現(xiàn)什么樣的情況都有可能。

當(dāng)然了,雖說是“未定義行為”,到底還是有一定的原因造成你所看到的結(jié)果的。是的沒錯(cuò),當(dāng)你足夠通曉 C 語言之后,自然會(huì)明白為什么你看到的“未定義行為”表現(xiàn)出這樣或那樣的結(jié)果。 只不過不要在初學(xué)時(shí)(尤其是在沒有人指導(dǎo)時(shí))就想這些,因?yàn)槟愫芸赡軙?huì)加入很多錯(cuò)誤的“腦補(bǔ)”,這反而會(huì)造成你理解錯(cuò)誤(你發(fā)的這個(gè)問題就是如此啊)!

查看完整回答
2 反對 回復(fù) 2017-05-18
  • asdhjhg
    asdhjhg
    非常感謝!我已經(jīng)理解了!但是你說的在初學(xué)階段,你只要記住這些函數(shù)的行為,然后按照它們的規(guī)則使用這些函數(shù)即可。但是我有強(qiáng)迫癥。。。。。我會(huì)用了,就是知道how不知why我經(jīng)常會(huì)抓狂。。。。總有種被控制住的感覺。所以,我還是會(huì)想whywhywhy。。。。。
  • onemoo
    onemoo
    這很正常,并且其實(shí)是好事,這表示你保持了很好的好奇心和探索欲。但正如我之前所說,錯(cuò)誤的腦補(bǔ)可能會(huì)大大地誤導(dǎo)你,糾纏于你當(dāng)前無法理解的錯(cuò)誤反而會(huì)降低學(xué)習(xí)效率,還不如按部就班地學(xué),學(xué)到深入之后這些你就都能理解了。 再說個(gè)題外的,這就是為什么科班學(xué)生或有老大帶的人能進(jìn)步得很快的原因,即便是在初學(xué)階段,當(dāng)他們有這樣的疑惑時(shí),老師或大佬就能幫他們解答,這樣能迅速精進(jìn)功力啊...
  • onemoo
    onemoo
    所以如果沒人指導(dǎo)你,而你又遇到讓你鉆牛角尖的問題的話,就在這里發(fā)問吧。 雖然這里的回答水平參差不齊,但應(yīng)該還是能碰到讓你滿意的回答的...吧。 啊,剛意識(shí)到,你又會(huì)Linux又會(huì)python,不算是完全的初學(xué)者,那你學(xué)習(xí)C應(yīng)該不會(huì)遇到太大的困難的
點(diǎn)擊展開后面7
  • 1 回答
  • 1 關(guān)注
  • 2799 瀏覽
慕課專欄
更多

添加回答

舉報(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)