忘記為 0 分配一個額外的位元組

當你將字串複製到 malloced 緩衝區時,請務必記住向 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 */