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
相关产品推荐
相关产品推荐

