我正在嘗試將 LPCSTR 值復制到指向 char 陣列的指標。使用此代碼,我遇到運行時錯誤并且無法在此處診斷根本原因
我的代碼如下所示
LPCSTR src = "R2C7YQT8";
char *dest [4];
memset(dest, 0, sizeof(dest));
strncpy_s(dest[0], sizeof(dest[0]), src, 12);
如何將 LPCSTR 字串復制到 C 中指向 char 陣列的指標?
uj5u.com熱心網友回復:
strncpy_s(dest[0], sizeof(dest[0]), src, 12);是告訴strncpy_s復制到任何dest[0]指向。dest[0]是一個NULL指標(dest它本身是一個由四個這樣的指標組成的陣列),因此您可以通過嘗試寫入NULL指標指向的位置來呼叫未定義的行為。
任何一個:
- 您需要制作任何適當大小
dest的陣列并復制到自身,或者chardest - 您需要將指標初始化為
dest[0]有用(且足夠大)的東西,然后復制到其中。
在這兩種情況下,通過sizeof(dest[0])都是錯誤的;你告訴它復制等于一個指標大小的位元組數,而不是它指向的資料。
案例#1的解決方案:
LPCSTR src = "R2C7YQT8";
char dest[9]; // Allocate enough space for the whole string as plain char array; can use higher number if desired
memset(dest, 0, sizeof(dest));
strncpy_s(dest, sizeof(dest), src, 12); // copy to dest directly, sizeof(dest) okay because it's local array
案例#2的解決方案:
LPCSTR src = "R2C7YQT8";
char *dest[4];
memset(dest, 0, sizeof(dest));
size_t srclen = strlen(src); // Compute length of input string
dest[0] = malloc(srclen 1); // Allocate space 1 byte for NUL terminator
strncpy_s(dest[0], srclen 1, src, 12); // Copy it up to that many characters
請注意,當它是一個文字字串時,案例#1 可以簡化為:
char dest[] = "R2C7YQT8";
它將自動調整大小dest并直接初始化它,而無需中間步驟(實際上它可能會memcpy從全域資料中對較大的字串執行類似操作,或者它可能只是插入使位元組正確的直接堆疊操作),但這僅限于文字字串和直接初始化案例(你不能通過LPCSTR傳遞給函式等來做到這一點)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/521919.html
標籤:数组C指针温纳皮字符
