我的问题涉及像memset和strcat这样的方法,它们返回作为参数传递的指针。例如:
案例1:
const char *src = /*assign space*/;
char *dst = /*assign space*/;
dst = strcat(dst, src);
案例2:
const char *src = /*assign space*/;
char *dst = /*assign space*/;
strcat(dst, src);
案例2可以被认为是不安全的,被调用的函数会改变指向的内存。是否应始终使用案例1的明确重新分配?
如果要使用案例2,可以使用变体:
char * const dst = /*assign space*/;
用于确保在调用后指针保持不变?
答案 0 :(得分:3)
您的两个案例都同样安全,但不需要第一个案件中的额外作业。
strcat
不会重新分配任何内容,也不会“更改指向的内存”,因此无需在此处获取返回值。调用后指针保证保持不变。
答案 1 :(得分:2)
dst
不会改变。 dst
必须足够大才能包含连接字符串。
因此strcat()
没有分配内存。
答案 2 :(得分:0)
“通常”你没有使用显式赋值,这就足够了
strcat(dst, src);
返回的指针和传递的指针都包含相同的地址,即您先前分配的内存的地址。
这是从strcat()
A simple implementation of strncat() might be: char* strncat(char *dest, const char *src, size_t n) { size_t dest_len = strlen(dest); size_t i; for (i = 0 ; i < n && src[i] != '\0' ; i++) dest[dest_len + i] = src[i]; dest[dest_len + i] = '\0'; return dest; }
如您所见,dest
未更改,因此返回的指针和传递的指针指向同一地址。
这个
char * const dst = /*assign space*/;
不会让你这么做
dst = strcat(dst, src);
所以,它会强迫你使用第一种方法。