【问题标题】:C string value destroyed when function returnsC字符串值在函数返回时被破坏
【发布时间】:2021-10-26 14:26:12
【问题描述】:

所以我有这个功能:

char    *ft_string(char *s, int *i) {
int     j;
char    *res;

j = *i;
res = NULL;
while (s[j] && s[j] != ' ' && s[j] != '\"' && s[j] != '\'' && s[j] != '$')
{
    if (s[j] == '\\')
        ft_remove_char(s, j);
    j++;
}
res = ft_substr(s, *i, j - *i);
(*i) = j - 1;
return (res);

调用 ft_remove char:

void    ft_remove_char(char *s, int i){
char    *ret;
int     j;

ret = malloc((int)ft_strlen(s) * 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[j - 1] = '\0';
if (s)
    free(s);
s = ret;

当 ft_remove_char 返回时,s 值在 ft_string 中消失。 我不知道我做错了什么,我在堆上分配了一个字符串,然后让 s 指向它。

【问题讨论】:

  • 先格式化你的代码。
  • 2.描述谁的功能应该做什么。示例输入和示例输出。
  • 您可以调用更多ft_* 函数。所有这些都可能导致问题
  • ft_remove_char() 内部,您无法更改ft_string()s,因为您通过值传递它。
  • s 在 ft_remove_char 返回后立即被销毁,所以我确信问题来自那里。

标签: c memory malloc


【解决方案1】:

C 中的参数是按值传递的。函数ft_remove_char 接收指针s副本。所以,当它覆盖s时,不会影响ft_string中的s

相反,尝试从ft_remove_char 返回修改后的s,并将ft_string 中的调用更改为:

s = ft_remove_char(s, j);

这在 C 语言中非常惯用。

注意:这仅回答您的问题。我尚未验证您的代码是否正确。

【讨论】:

  • 好像行得通,我之前试过但可能做错了。
  • 感谢伙伴感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2011-06-26
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
相关资源
最近更新 更多