char *p = NULL;
p = malloc(strlen(a[0]) + 1);
strcnp(a[0], p); // 函數內 p = 新地址
printf("%s", p); // 仍指向舊 malloc 內存(未被複製內容)
char *strcnp(char *sd, char *ds) {
char *q = sd;
while ((*ds++ = *sd++) != '\0') ;
return q; // 返回源地址,未修改 ds 指向
}
C 語言參數按值傳遞。ds 是 p 的副本,函數內 ds = new_addr 只改變副本,外部 p 不受影響。
void strcnp(char *sd, char **pds) {
*pds = malloc(strlen(sd) + 1);
strcpy(*pds, sd);
}
// 調用
char *p = NULL;
strcnp(a[0], &p); // 傳遞 p 的地址
printf("%s", p);
free(p);
char* strdup_new(const char *src) {
char *dst = malloc(strlen(src) + 1);
if (dst) strcpy(dst, src);
return dst;
}
// 調用
char *p = strdup_new(a[0]);
printf("%s", p);
free(p);
void strcnp(const char *sd, char *ds, size_t ds_size) {
strncpy(ds, sd, ds_size - 1);
ds[ds_size - 1] = '\0';
}
// 調用
char buf[256];
strcnp(a[0], buf, sizeof(buf));
「一級指針傳值,改指向不生效;要改指向傳二級,或直接返回新指針。」