2011-11-05 59 views
0

我現在正在上課的指針,我們的教科書讓我有點困惑。他們開始通過說下面的例子複製的地方價值指向的資金投入到地方通過myMoney指出:教科書中的指針示例讓我感到困惑

*myMoney = *money; 

那麼接下來的示例將在金錢的價值爲myMoney

myMoney = money; 

第二個示例會導致內存泄漏,因爲* myMoney指出的原始位置不再可訪問。這是因爲用於存放指針的內存現在是一個實際的浮點值而不是內存地址?

現在讓我有點困惑的部分是在下一部分,當他們展示不同的聲明。完整的示例:

char alpha[20]; 
char *alphaPtr; 
char *letterPtr; 
vod Process(char []); 
. 
. 
alphaPtr = alpha; 
letterPtr = &alpha[0]; 
Process(alpha); 

因爲書上說,因爲它切斷指針之間的聯繫,它指出地址

myMoney = money; 

將創建一個內存泄漏,將

alphaPtr = alpha; 

原因一個記憶鏈接呢?難道他們不應該已經宣佈它像

char *alphaPtr = *alpha; 
+0

我只是想感謝你們所提供的幫助! – JeramyRR

回答

2

請注意以下事項:

  • myMoneymoney是指針,所以myMoney = money;拷貝一個指針超過另一個。現在你有兩個指針指向相同的東西(money指向什麼),並沒有指出myMoney用來指向什麼(這是內存泄漏)。
  • *myMoney*money指出由指針的值(因爲*指針引用指針得到什麼它指向),所以*myMoney = *money;副本什麼money點在什麼myMoney點;指針本身沒有改變。
  • alpha數組,它可以是降級到一個指向數組中的第一個元素的指針。
  • alphaPtr沒有泄漏,因爲它並沒有指向任何東西。
  • 是的,char *alphaPtr = *alpha;本來是一個更好的方式來寫它,因爲然後alphaPtr不花任何時間未初始化。有些編譯器甚至會在你聲明像教科書示例那樣的未初始化的指針時發出警告。
  • 使用(取消引用)未初始化的指針是一個壞事,因爲它導致可怕的未定義的行爲。你的程序可能會立即崩潰,或者它可能會在晚些時候崩潰,或者它可能會在沒有告訴你任何事情的情況下簡單地破壞你的數據,並且只有幾個月後纔會發現它。如果myMoney以前在動態分配的內存指向
+0

對不起,只是修復了「鏈接」部分。 – JeramyRR

+0

謝謝。我不知道爲什麼當我第一次在教科書中看到它時,我沒有得到。出於某種原因,我在想,當它首次被宣佈時,它會保留一個內存插槽,然後當我們稍後分配它時,它會從內存插槽中斷開並創建另一個插槽,但這是錯誤的想法。 – JeramyRR

+1

指針是編程中更加棘手的主題之一。它需要從代數的「一個變量持有一個價值」的心態躍進,因爲如果它是一個指針,變量現在僅僅包含一個沒有(本科)數學並行的值的地址(外部計算機科學,至少)。 –

0

第二個例子會導致內存泄漏,因爲* myMoney指出原來的位置就不再訪問。這是因爲用於存放指針的內存現在是一個實際的浮點值而不是內存地址?

存儲在myMoney中的內存位置現在丟失。如果它被分配了,那麼將無法恢復它的地址來釋放它。

在第二個示例中,數組是特殊的,通過名稱引用它們引用它們的地址。

0

與分配指針

myMoney = money; 

的問題就是,如果myMoney是唯一的指針值,你不再有任何的方式來訪問它。

+1

所以,如果我從來沒有指針指向任何聲明過程中,我什麼時候不會丟失任何東西? – JeramyRR

+1

沒錯,但是如果你沒有值來分配它,你可能不應該聲明一個指針。當指向對象的* last *指針丟失時發生泄漏。那麼你現在不再是那個對象的地方了。 –

+0

因此,如果發生內存泄漏,垃圾回收器是否會回收該內存供以後使用,或者只是佔用了空間,直到程序終止? – JeramyRR

0

myMoney = money會泄漏。 myMoney正在分配一個新的內存地址指向,所以它最初指向的內存將泄漏,如果沒有別的指向它了,所以它可以在以後釋放。

alphaPtr = alpha不是泄漏。 alpha是實際的內存,alphaPtr只是指向它。即使alphaPtr被指定指向別的東西,alpha也存在於堆棧中,並在超出範圍時自動回收。

char *alphaPtr = *alpha不會編譯。您正嘗試將char分配給char*,這是無效的。

+0

好吧,我在考慮* alpha會將它的地址分配給* alphaPtr。 – JeramyRR

+1

你指定的*指針與你是否泄露內存無關。關鍵是:指針的以前的值是否指向其他地方沒有跟蹤的內存?換句話說,指針的* new *值不會導致泄漏,它是* old *值。由於舊的值在'alphaPtr'的情況下無效,因此不會泄漏。 –