strcpy 和“=”有什么区别?
What is the difference between strcpy and "="?
我想知道 char* test = "test"
和 strcpy(test, "test")
之间是否有区别,如果有,区别是什么。
谢谢。
strcpy 函数(永远不要使用! -- 使用 strncpy or strdup 以避免缓冲区溢出漏洞),将字节从一个字符串缓冲区复制到另一个;分配更改您指向的缓冲区。请注意,要调用 strncpy(或 strcpy,但不要!),您需要已经分配了一个缓冲区来执行此复制。当您从文字字符串进行赋值时,编译器实际上已经创建了一个只读缓冲区,并且您的指针会更新为该缓冲区的地址。
更新
正如评论中所指出的,strncpy 也有其缺点。您最好使用自己的辅助函数将数据从一个缓冲区复制到另一个缓冲区。例如:
ReturnCode CopyString(char* src, char* out, int outlen) {
if (!src) {
return NULL_INPUT;
}
if (!out) {
return NULL_OUTPUT;
}
int out_index = 0;
while ((*src != '[=10=]') && (out_index < outlen - 1)) {
out[out_index++] = *src;
src++;
}
out[out_index] = '[=10=]';
if (*src != '[=10=]') {
if (outlen > 0) {
out[0] = '[=10=]'; // on failure, copy empty rather than partially
}
return BUFFER_EXCEEDED;
}
return COPY_SUCCESSFUL;
}
而且,如果您可以使用 C++,而不仅仅是 C,那么我建议您使用 std::string
。
我想知道 char* test = "test"
和 strcpy(test, "test")
之间是否有区别,如果有,区别是什么。
谢谢。
strcpy 函数(永远不要使用! -- 使用 strncpy or strdup 以避免缓冲区溢出漏洞),将字节从一个字符串缓冲区复制到另一个;分配更改您指向的缓冲区。请注意,要调用 strncpy(或 strcpy,但不要!),您需要已经分配了一个缓冲区来执行此复制。当您从文字字符串进行赋值时,编译器实际上已经创建了一个只读缓冲区,并且您的指针会更新为该缓冲区的地址。
更新
正如评论中所指出的,strncpy 也有其缺点。您最好使用自己的辅助函数将数据从一个缓冲区复制到另一个缓冲区。例如:
ReturnCode CopyString(char* src, char* out, int outlen) {
if (!src) {
return NULL_INPUT;
}
if (!out) {
return NULL_OUTPUT;
}
int out_index = 0;
while ((*src != '[=10=]') && (out_index < outlen - 1)) {
out[out_index++] = *src;
src++;
}
out[out_index] = '[=10=]';
if (*src != '[=10=]') {
if (outlen > 0) {
out[0] = '[=10=]'; // on failure, copy empty rather than partially
}
return BUFFER_EXCEEDED;
}
return COPY_SUCCESSFUL;
}
而且,如果您可以使用 C++,而不仅仅是 C,那么我建议您使用 std::string
。