阿杰,我给你整理一份 strdup 函数详解,包括概念、用法、返回值、注意事项和示例。


一、概念

  • 函数原型(C 标准库):
char *strdup(const char *s);

  • 作用:复制一个字符串 s 并在堆上分配新内存,返回新字符串的指针。
  • 所在头文件
#include <string.h>
#include <stdlib.h> // 部分系统需要

  • 返回值
    • 成功:返回指向新字符串的指针(在堆上分配)
    • 失败:返回 NULL(内存不足)

二、工作原理

  1. 根据原字符串长度 + 1(包含 \0)分配内存
  2. 将原字符串内容复制到新内存
  3. 返回新内存地址

等价于:

char *strdup(const char *s) {
    size_t len = strlen(s) + 1;
    char *p = malloc(len);
    if (p) {
        memcpy(p, s, len);
    }
    return p;
}


三、使用示例

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    const char *original = "Hello, AJie!";
    char *copy = strdup(original); // 复制字符串

    if (copy == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    printf("原字符串: %s\n", original);
    printf("复制字符串: %s\n", copy);

    free(copy); // 注意释放内存
    return 0;
}

输出

原字符串: Hello, AJie!
复制字符串: Hello, AJie!


四、注意事项

  1. 动态内存strdup 在堆上分配内存,需要 手动释放free())。
  2. 跨平台
    • POSIX 标准支持 strdup
    • C11 标准没有正式包含,可在 Windows 用 _strdup()
  3. 安全性
    • 输入字符串为 NULL 会导致未定义行为
    • 注意捕获返回值,防止内存分配失败

五、总结

  • 用途:复制字符串并返回新堆内存指针
  • 关键点
    • strdup 自动分配内存并复制字符串
    • 需要 free() 释放内存
    • POSIX 环境下可直接使用,Windows 用 _strdup()
  • 替代方法:手动 malloc + strcpy