最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問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)存地址第一個是隨機的后面都是初始化0???有截圖malooc和calloc初始化肯定不一樣啊,一個隨機的比如分配的地址是 -17891602,而calloc是初始化為0的 地址應該是 0,不明白上面怎么執(zhí)行的不對?free的問題,難道是因為指針A返回的value是內(nèi)存中第一個地址的緣故?所以free只在第一個地址位置隨機分配?我感覺整個人都不好了。。。。。還有realloc也是這問題,增加了雙倍內(nèi)存,然后增加部分的內(nèi)存第一個地址是隨機的,后面都是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貢獻883條經(jīng)驗 獲得超454個贊

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

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

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

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

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

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

    還有,不要因為看到都是 0 就覺得“malloc 難道也會將分配的地址中的值初始化為 0???”,這只是碰巧了而已。

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

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

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

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

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

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

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

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


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

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

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號