2015-10-05 41 views
0

例如,我有以下指針:分配指針時,memcpy和just assigning之間有什麼區別?

char *ptr; 
char *string; 

string = malloc(sizeof(char) * 10); 
//set string to some word 

是什麼以下行之間的區別?

ptr = string; 

vs. 

memcpy(ptr, string, sizeof(string)); 

另外,如果我嘗試在這些任務之後釋放「字符串」,是否會出現問題? 「ptr」會保留我分配的值嗎?

+2

這是指針和指針的區別。 –

回答

1
memcpy(ptr, string, sizeof(string)); // but you will need to allocate memory to ptr 

(如由@alk爵士指出48或字節)由 ptr指出存儲器塊這將複製的指定的字節數。

使用memcpy內存塊,其中ptrsrc不同。

然而,這 -

ptr = string; 
在此 ptr

存儲器塊string點。

+0

和「*'sizeof(string)'*」是多少? – alk

+0

不,因爲指針不是數組。您可能想閱讀* John Bollinger *(http://stackoverflow.com/a/32954656/694576)的其他答案,以及可能的評論:http://stackoverflow.com/questions/32954433/when-我的分配指針是什麼是差異之間的一個memcpy和剛剛分配/ 32954477?noredirect = 1#comment53735816_32954590。 – alk

+0

@alk哦,是的,'sizeof'將會看到它的類型不是內容。謝謝 !! – ameyCU

-1

ptr = string;會讓ptr「指向」同一地址string

memcpy(ptr,string,sizeof(string))將複製存儲在地址中的數據指向string的地址通過ptr指向。 memcpy()將只複製指定的字節數(在您的示例中爲10)。

由於ptr未定義,以後會導致錯誤,因爲您已經寫入了它。

回答你的第二部分問題。如果您執行memcpy()ptr仍然會保留您在free(string)後複製到它的數據。 ptr將在ptr = string的情況下失效,因爲它們都指向相同的地址。

+0

「* ...複製指定的字節數(在您的示例中爲10)。*」不,它可以複製4或8個字節,具體取決於是在32位還是64位平臺上運行。指針不是數組。 – alk

5

以下幾行有什麼區別?

ptr = string; 

memcpy(ptr, string, sizeof(string)); 

前者賦予變量ptr指向同一個位置是string點。後者嘗試將sizeof(string)個字節從string指向的位置複製到ptr指向的位置。但是,如果ptr尚未初始化爲指向足夠大的內存塊以包含多個字節,或者根本沒有初始化,則行爲是未定義的。

也請注意,sizeof(string)通常不是string類型爲char *時所需的字節數。您可能需要strlen(string) + 1,或者您可能希望內存塊string指向的大小(本例中爲10)。但是sizeof(string)是一個指針的大小,對於指向相同類型的指針而言是相同的 - 可能是4或8個字節,具體取決於您的實現。

另外,如果我試圖在 這些任務之後釋放「字符串」,是否會出現問題? 「ptr」是否仍然保留我賦予其 的價值?

ptr = string之後,這兩個變量指向相同的內存塊。釋放內存沒有任何固有的問題,您可以通過任一指針來完成這項任務,但是您不能嘗試解除引用任何一個指針,直到您爲其指定一個指向可訪問內存塊的新值。

另一方面,在memcpy()之後,如果行爲完全被定義(見上),則每個指針指向相同數據的單獨副本。釋放其中一個只能釋放該副本 - 在這種情況下,取消引用另一個仍然可以。

相關問題