[英]When assigning pointers, what is the difference between a memcpy and 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”是否仍會保留我為其分配的值?
以下幾行有什么區別?
ptr = string;
與
memcpy(ptr, string, sizeof(string));
前者分配變量ptr
指向string
指向的相同位置。 后者嘗試將sizeof(string)
個字節從位置string
點復制到ptr
指向的位置。 但是,如果尚未將ptr
初始化為指向一個足以容納這么多字節的內存塊,或者根本沒有初始化它,則該行為未定義。
還要注意,當string
類型為char *
時, sizeof(string)
通常也不是您想要的字節數。 您可能希望改用strlen(string) + 1
,或者您想要存儲塊string
指向的大小(在這種情況下為10)。 但是sizeof(string)
是指針的大小,對於相同類型的任何指針都是相同的-可能是4或8個字節,具體取決於您的實現。
另外,如果我在這兩個作業中的任何一個之后嘗試釋放“字符串”,都會有問題嗎? “ ptr”是否仍會保留我為其分配的值?
在ptr = string
,這兩個變量指向同一塊內存。 釋放該內存沒有內在的問題,您可以通過任一指針執行此操作,但是此后切勿嘗試取消引用任一指針,除非您為其分配了指向可訪問內存的新值。
另一方面,在memcpy()
之后,如果完全定義了行為(請參見上文),則每個指針都指向同一數據的單獨副本。 釋放其中一個僅釋放該副本-在這種情況下,取消引用另一個副本仍然可以。
memcpy(ptr, string, sizeof(string)); // but you will need to allocate memory to ptr
這會將指定字節數(@alk Sir指出為4
或8
個字節)復制到ptr
指向的內存塊中。
使用ptr
和src
不同的memcpy
內存塊。
鑒於此-
ptr = string;
在此ptr
指向string
指向的存儲塊 。
ptr = string;
將使ptr
“指向”與string
相同的地址
memcpy(ptr,string,sizeof(string))
將存儲在string
指向的地址上的數據復制到ptr
指向的地址。 memcpy()
將僅復制指定的字節數(在您的示例中為10)。
由於未定義ptr
因此稍后將在您編寫錯誤時導致錯誤。
回答您問題的第二部分。 如果執行memcpy()
,則在free(string)
之后, ptr
仍將保留復制到該數據的數據。 如果ptr = string
,則ptr
將變得無效,因為它們都指向相同的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.