簡體   English   中英

分配指針時,memcpy和僅分配之間有什么區別?

[英]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指出為48個字節)復制到ptr指向的內存塊中。

使用ptrsrc不同的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM