You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中创建依赖子串长度的动态字符数组?

解决C语言动态数组大小的问题

针对你的需求,有两种可靠的实现方式,同时需要修复代码中的潜在安全问题:

方法一:使用malloc动态分配堆内存(推荐)

这是C语言实现动态数组的标准方案,堆空间远大于栈空间,内存生命周期可控,适合需要返回数组或数组尺寸较大的场景。

修改后的代码示例:

char* RandomText(char* originalMsg)
{
    char* subString;
    char msgClone[256];
    // 安全拷贝,避免原字符串过长导致缓冲区溢出
    strncpy(msgClone, originalMsg, sizeof(msgClone) - 1);
    msgClone[sizeof(msgClone) - 1] = '\0';

    subString = strtok(msgClone, "<");
    subString = strtok(NULL, ">"); 
    // 检查是否成功提取到<>内的子串
    if (subString == NULL) {
        return NULL;
    }

    int spewageSize = 115 - strlen(subString);
    // 确保数组大小为正,避免非法内存分配
    if (spewageSize <= 0) {
        return NULL;
    }

    // 动态分配内存,sizeof(char)可省略(默认等于1)
    char* text = malloc(spewageSize);
    // 检查内存分配是否成功
    if (text == NULL) {
        return NULL;
    }

    // 后续代码操作text数组,例如填充内容
    // 示例:memset(text, 'x', spewageSize - 1); text[spewageSize - 1] = '\0';

    // 返回动态分配的数组,调用者必须在使用完后用free(text)释放内存
    return text;
}

关键注意事项:

  • 必须检查malloc的返回值,避免空指针操作导致程序崩溃。
  • 调用该函数的代码必须负责释放内存,即调用free(返回的指针),否则会造成内存泄漏。
  • 用strncpy替代strcpy,防止原字符串长度超过msgClone的容量(256)导致缓冲区溢出。
  • 增加对subString的空指针检查,避免原字符串中没有<>时调用strlen引发崩溃。

方法二:使用变长数组(VLA)

C99标准支持变长数组(即char text[spewageSize];这种写法),但存在明显局限性:

  • 不是所有编译器都默认支持(比如MSVC需要手动开启C99或更高版本的编译选项)。
  • 变长数组分配在栈上,栈空间通常只有几MB,若spewageSize过大,会直接导致栈溢出,程序崩溃。
  • 不能返回变长数组的指针,因为函数执行完毕后栈帧被销毁,内存会被回收,返回的指针会变成野指针,访问时会触发未定义行为。

如果一定要用VLA,修改后的代码(仅适合数组尺寸较小且不需要返回的场景):

void RandomText(char* originalMsg, char* output, int maxOutputSize)
{
    char* subString;
    char msgClone[256];
    strncpy(msgClone, originalMsg, sizeof(msgClone) - 1);
    msgClone[sizeof(msgClone) - 1] = '\0';

    subString = strtok(msgClone, "<");
    subString = strtok(NULL, ">"); 
    if (subString == NULL) {
        return;
    }

    int spewageSize = 115 - strlen(subString);
    if (spewageSize <= 0 || spewageSize > maxOutputSize) {
        return;
    }

    char text[spewageSize];
    // 后续代码操作text,然后将内容拷贝到output参数中
    memcpy(output, text, spewageSize);
}

内容的提问来源于stack exchange,提问作者kerstoff0mega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:34:53