1、strdup 在 C 中的作用
strdup 函数用于创建一个给定字符串的副本。它会动态分配内存,将原字符串复制到新分配的内存中,并返回指向该新字符串的指针。
char *strdup(const char *str);
str是指向要复制的以空字符 ('\0') 结尾的字符串的指针。返回值是返回一个指向新分配字符串的指针,新字符串的内容与传入的字符串相同。如果内存分配失败,则返回 NULL。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>  // 用于 free()
int main() {
    const char *original = "Hello, World!";
    char *copy = strdup(original);
    if (copy == NULL) {
        perror("strdup 失败");
        return 1;
    }
    printf("原字符串: %s\n", original);
    printf("复制的字符串: %s\n", copy);
    free(copy);  // 释放分配的内存
    return 0;
}
2、strdup 的自定义实现
如果某些平台不支持 strdup,可以使用 malloc 和 strcpy 自行实现。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *my_strdup(const char *str) {
    if (str == NULL) {
        return NULL;
    }
    size_t len = strlen(str) + 1;  // 包括空字符
    char *copy = malloc(len);      // 动态分配内存
    if (copy != NULL) {
        strcpy(copy, str);         // 复制字符串
    }
    return copy;                   // 返回新字符串的指针
}
int main() {
    const char *original = "Hello, World!";
    char *copy = my_strdup(original);
    if (copy == NULL) {
        perror("my_strdup 失败");
        return 1;
    }
    printf("原字符串: %s\n", original);
    printf("复制的字符串: %s\n", copy);
    free(copy);  // 释放分配的内存
    return 0;
}
3、strdup 的替代方法
如不想使用 strdup,可以使用其他标准库函数(如 malloc 和 strcpy)手动分配和复制字符串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    const char *original = "Hello, World!";
    size_t len = strlen(original) + 1;
    char *copy = malloc(len);  // 动态分配内存
    if (copy == NULL) {
        perror("malloc 失败");
        return 1;
    }
    strcpy(copy, original);    // 复制字符串
    printf("原字符串: %s\n", original);
    printf("复制的字符串: %s\n", copy);
    free(copy);  // 释放分配的内存
    return 0;
}