C语言 strdup 函数

C 语言中,strdup 函数用于复制一个字符串,并返回一个指向新分配的、包含该字符串副本的内存块的指针。这在需要动态分配内存以保存字符串副本时非常有用。在现代 C 编程中,尽量使用更安全的动态内存管理方法,结合工具检查内存泄漏和非法访问。

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,可以使用 mallocstrcpy 自行实现。

#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,可以使用其他标准库函数(如 mallocstrcpy)手动分配和复制字符串。

#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;
}

推荐阅读
cjavapy编程之路首页