說我有一些代碼片段
char *str = malloc(sizeof(char)*10)
// some code to add content to the string in some way
創建一個 10 個字符的字串。如果我再復制str與strcpy從標準字串庫到像這樣的新變數
char *copy;
strcpy(copy, str);
我知道然后我需要免費str使用free(str),但這足夠了嗎?或者是否strcpy也為copy從 malloc 創建的字串上使用動態分配記憶體?
uj5u.com熱心網友回復:
或者 strcpy 是否也為復制動態分配記憶體
不,strcpy對記憶體一無所知,因此您的代碼將一個字串復制到一個指向 la-la land 的未初始化指標中。
如果你想在同一個呼叫中分配 復制,那么它是非標準的strdup(看起來它將被添加到下一版本語言的 C 標準中)。
或者只是做char *copy = malloc(strlen(str) 1);然后strcpy。請記住始終為空終止符留出空間。
uj5u.com熱心網友回復:
strcpy不分配,因此您的第二個代碼段無效,除非copy用某個緩沖區初始化(無論它是堆疊還是堆分配)或者是一個足夠大的陣列。
旁注:如果您不知道源字串的確切長度,則需要確保不超過目標緩沖區大小(例如,通過使用strncpy或提供足夠大的目標緩沖區)。
我想檔案應該詳細回答您的問題。
uj5u.com熱心網友回復:
對于初學者,指標副本未初始化
char *copy;
所以這個 strcoy 的呼叫
strcpy(copy, str);
導致未定義的行為。
指標copy必須指向一個字符陣列,指標指向的字串str將被復制到該字符陣列中。
您需要釋放用 malloc、calloc 或 realloc 分配的內容。
因此,如果指標副本指向的目標陣列是動態分配的,例如
char *copy = malloc( 10 * sizeof( char ) );
那么當然,當不再需要分配的記憶體時,您將需要釋放它。
這與strcpy僅將字串從一個字符陣列復制到另一個字符陣列的函式沒有什么共同之處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/367101.html
