在 iOS 開發中,常需要將 UITextField 獲取的文字(NSString*)轉換為 C 語言的 char* 以供底層函數使用。然而,直接使用 [str UTF8String] 返回的是 const char*,若目標函數參數為 char*,編譯器會報錯:Cannot initialize a parameter of type 'char *' with an rvalue of type 'const char *'。
UTF8String 方法返回的是常量指針,而目標函數(如 CUserSession::Login(char *pUsername, char *pPassword))要求可修改的指針。強制轉型為 (const uint8_t*) 同樣無效,因為本質仍是常量。
需先複製字串內容到可變緩衝區,再傳遞指針:
NSString *str = textField.text;
char *ch = strdup([str UTF8String]); // 複製到堆內存,獲得 char*
// 呼叫 C 函數
CUserSession::Login(ch, passwordCharPtr);
// 使用完畢釋放
free(ch);
或使用固定大小緩衝區(避免動態分配):
char buffer[256];
strncpy(buffer, [str UTF8String], sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0';
CUserSession::Login(buffer, passwordBuffer);
free() 動態分配的內存,防止洩漏。strdup 或 UnsafeMutablePointer 處理。掌握這類型轉換細節,能避免崩潰與未定義行為,讓 Objective-C 與 C/C++ 混編更穩健。