忘記為 0 分配一個額外的位元組
當你將字串複製到 malloc
ed 緩衝區時,請務必記住向 strlen
新增 1。
char *dest = malloc(strlen(src)); /* WRONG */
char *dest = malloc(strlen(src) + 1); /* RIGHT */
strcpy(dest, src);
這是因為 strlen
在長度上不包括尾隨\0
。如果你採用 WRONG
(如上所示)方法,在呼叫 strcpy
時,你的程式將呼叫未定義的行為。
它也適用於從 stdin
或其他來源讀取已知最大長度的字串的情況。例如
#define MAX_INPUT_LEN 42
char buffer[MAX_INPUT_LEN]; /* WRONG */
char buffer[MAX_INPUT_LEN + 1]; /* RIGHT */
scanf("%42s", buffer); /* Ensure that the buffer is not overflowed */