以下幾行有什麼區別?
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()
之後,如果行爲完全被定義(見上),則每個指針指向相同數據的單獨副本。釋放其中一個只能釋放該副本 - 在這種情況下,取消引用另一個仍然可以。
這是指針和指針的區別。 –