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

C语言调用函数后C string value被销毁 指针指向失效问题咨询

问题根因

核心是C语言的函数参数为值传递,当前写法无法修改外部传入的指针本身的值:

  • ft_remove_char中定义的形参char *s是外部实参指针的副本,属于作用域仅限函数内部的局部变量
  • 函数末尾执行的s = ret仅修改了局部形参的指向,完全不会影响ft_string中s变量的指向
  • 你在函数内部已经执行free(s)释放了原堆内存,此时ft_string中的s就变成了野指针,访问时自然会出现值异常、崩溃等问题
解决方案

有两种常用修复方案:

方案1:修改ft_remove_char接收二级指针

直接通过二级指针修改外部指针的指向:

// 函数形参改为二级指针
void    ft_remove_char(char **s, int i){
    char    *ret;
    int     j;
    int     len = ft_strlen(*s);

    ret = malloc(len * sizeof(char) + 1);
    if (ret == NULL)
        return ;
    j = -1;
    while (++j < i)
        ret[j] = (*s)[j];
    i = j;
    while ((*s)[++j])
    {
        ret[i] = (*s)[j];
        i++;
    }
    ret[i] = '\0';
    free(*s); // 释放原堆内存
    *s = ret; // 修改外部指针的指向
}

同步修改ft_string中的调用逻辑,传入s的地址:

if (s[j] == '\\')
    ft_remove_char(&s, j);

方案2:修改ft_remove_char返回新字符串指针

将新生成的字符串指针作为返回值传回,外部用原变量接收:

char*    ft_remove_char(char *s, int i){
    char    *ret;
    int     j;
    int     len = ft_strlen(s);

    ret = malloc(len * sizeof(char) + 1);
    if (ret == NULL)
        return s; // 分配失败直接返回原指针
    j = -1;
    while (++j < i)
        ret[j] = s[j];
    i = j;
    while (s[++j])
    {
        ret[i] = s[j];
        i++;
    }
    ret[i] = '\0';
    free(s);
    return ret;
}

同步修改ft_string中的调用逻辑,用s接收返回值:

if (s[j] == '\\')
    s = ft_remove_char(s, j);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:15:01