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

C语言传char指针引用调用strtok()后输出异常问题排查

问题分析与解决

你遇到的问题核心是局部变量内存失效导致的未定义行为,具体原因及修复方案如下:

关键错误点

parse函数中的char str[] = "Hello World!";是栈上的局部自动变量,当parse函数执行完毕返回main时,该函数的栈帧会被销毁,str占用的内存空间会被操作系统回收或被后续操作覆盖。

你在parse里通过*p = strtok(NULL, " ");让buf指向了str数组中的'W',但回到main后,这块内存已经不再有效,此时访问buf指向的内容属于访问已释放的栈内存,行为是未定义的——可能输出乱码、程序崩溃,甚至看起来“正常”(这更危险)。

修复方案

有几种可靠的方式解决这个问题:

方案1:使用静态数组

把str声明为静态变量,这样它会存储在静态存储区,函数返回后内存不会被释放:

void parse(char **p)
{
    static char str[] = "Hello World!"; // 静态存储区,函数返回后保留内存

    char *token = strtok(str, " ");
    *p = strtok(NULL, " ");
}

方案2:利用main中已分配的内存复制内容

直接将strtok获取到的"World!"复制到main里已经分配好的buf内存中,避免指向失效的局部内存:

#include <string.h>

void parse(char **p)
{
    char str[] = "Hello World!";
    char *token = strtok(str, " ");
    char *world_ptr = strtok(NULL, " ");
    // 复制到main分配的buf中
    strcpy(*p, world_ptr);
}

int main() 
{
    char *buf = malloc(20 * sizeof(char));
    if (!buf) { /* 处理内存分配失败的情况 */ }

    // 注释掉原内存泄漏的代码:buf = "How are you?";
    parse(&buf);
    printf("%s\n", buf);
    free(buf); // 释放内存
    return 0;
}

额外注意点

你在main里的这段代码存在内存泄漏:

char *buf = (char*)malloc(20 * sizeof(char));
buf = "How are you?";

malloc分配的内存地址被字符串字面量的地址覆盖,导致这块内存永远无法释放,需要去掉这行buf = "How are you?";,如果需要赋值可以用strcpy(buf, "How are you?");。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:35:34