2013-10-07 138 views
0

讓我們有一些指針的結構中,像tm複製對象

time_t timestamp = time(NULL); 
tm* now = localtime(&timestamp); 

要創建一個指向在自動存儲器的副本,由值複製可用於:

tm copy = *now; 
tm* next = © 
// next points to a copy in memory 

但爲什麼這個快捷方式不會將該值複製到新的內存塊? (gcc編譯器)

tm* next = &(*now); 
// next points to the address of now 

這聽起來很平凡,但我不確定背後的機制。爲什麼有差異?

+0

是否真的有可能使用指針複製值我知道它只參考一些數據的內存地址 – Shushant

+0

看來你需要閱讀(或重讀)一本好書C.這裏是一個[列表](http:///stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)讓你開始。 – RedX

+0

C中沒有「自動內存」(至少不是你想要使用它的方式);你必須以某種方式分配內存,'tm * next = ...'將只爲指針分配內存,*不爲結構分配內存。 –

回答

1

=僅用於將數據從一個存儲位置複製到另一個存儲位置。 &只給你一個變量的地址。 *只解引用一個變量。這些都不以任何形式分配內存,或者創建任何臨時變量。

所有內存分配都必須在C中明確說明。在這裏找不到的區別

+0

這是有道理的。所以當編譯器看到一個變量的聲明時,它會將它轉換爲那個地方的內存分配? –

+2

@JanTuroň是的,基本上你的'tm copy'和'tm * next'從棧中分配內存。 – user694733

0

隨着tm* next = &(*now);nextnow將指向相同的存儲位置,其中包含結構tm的數據。

沒有新的內存分配給next指向。

+0

我知道。但是爲什麼快捷方式也不創建副本? –

+0

@JanTuroň,因爲它沒有那個操作。它將'now'中的值賦給'next',它是'now'指向的地址。 – Rohan

1

顧名思義,指針指向記憶中的某個地方。他們不會自己分配必要的記憶。你必須自己做。

在您的代碼中,指針next實際上是指向位於內存中的位置,其中now位於該位置。如果通過指針修改任何值,則實際上是在修改原始結構。這就是指針的工作原理。

如果要分配內存,請使用malloccalloc。但請記住,分配的內存必須是free d。

一旦分配了內存,就可以按值複製它。

tm prev = ...// get the value 
tm* now = calloc (1, sizeof (tm)); 
*now = prev; // copy by value 
+0

我知道。但我不想在這裏使用動態內存管理。我只是好奇爲什麼快捷方式和雙線形式有所不同。 –

1

您的第一個示例將爲堆棧中的變量copy預留內存。 然後它會將now的內容複製到新的內存位置,最後有next指向該內存位置。

tm copy = *now; 
tm* next = © 

第二個例子將儲備任何新的存儲器;相反,它將簡單地將對象now指向next的地址(&)指向(*)。

tm* next = &(*now); 

他們不同的原因是C從不做任何「automagic」內存分配。你會得到你所要求的:如果你要求一個變量的記憶(如第一個例子),你會得到它;如果你不要求它,你不明白。

所以這兩個例子之間的區別確實是聲明一個變量(tm copy)是要求內存。

+0

現在很明顯。我希望你不介意我接受user694733的回答 - 僅僅因爲它是第一個看到我的觀點的人。謝謝。 –