Malloc更改另一个变量的值(char *)

时间:2016-11-04 14:36:41

标签: c memory malloc

所以我使用下面的代码,其中函数调用如下所示(注意字符串文字):

char *rmv_zeros(char *result, char base_0, char minus) {
    char *formatted;

    formatted = malloc(sizeof(char) * (strlen(result) + 1));
    if (result[0] == base_0 || (result[1] == base_0 && result[0] == minus)) {
        if (if_rmv_zeros_needed(result, formatted, base_0, minus) == char_to_str(base_0)) {
            return char_to_str(base_0);
        } else {
            return if_rmv_zeros_needed(result, formatted, base_0, minus);
        }
    } else {
        return result;
    }
    return formatted;
}

以下是代码:

if

代码不会进入第一个else语句,因此会进入2882303761517117440000001(我看到了调试的诡计)。

但它会返回'1',在结果的最后添加malloc()

但是,当我评论288230376151711744000000行(本例中的第五行)时,返回的值为printf("%s\n", result),这是输入的值和逻辑返回值。

对此有何帮助?

谢谢,

修改 实际上将module ApplicationHelper CONTROLLERS_LIST = ['UsersController'] def has_sub_menu CONTROLLERS_LIST.exclude?(params[:controller]) end end 放在第3行和第19行""修复"" (不是报价,我知道它不是一个真正的解决方案)问题。为什么呢?

2 个答案:

答案 0 :(得分:1)

这种行为只有一个原因:Undefined Behavior

一个主要原因可能是您使用malloc将内存泄漏到您的函数中。如果函数没有返回返回的内存,则分配的内存不是free d,换句话说,如果达到return result,则如在测试用例中那样。

首先管理它,否则,在执行一段时间后,malloc可能会失败。

如果代码的所有部分都没有处理malloc返回值,如代码所示,传递给结果的指针可能无效(换句话说== NULL

在您的功能中,您可以简单地管理malloc,如下所示,但请记住,调用者必须管理已分配的内存。

char* rmv_zeros(char *result, char base_0, char minus)
{
      char* formatted = NULL;

      if (result[0] == base_0 || (result[1] == base_0 && result[0] == minus))
      {
          formatted = malloc(sizeof(char) * (strlen(result) + 1));
          if (formatted != NULL)
          {
             if (if_rmv_zeros_needed(result, formatted, base_0, minus) == char_to_str(base_0))
               {
                  return char_to_str(base_0);
               }
               else
               {
                  return if_rmv_zeros_needed(result, formatted, base_0, minus);
               }
            }
        }
      else
      {
         return result;
      }
      return formatted;
}

看看你的整个代码来捕捉其他类似的问题。

答案 1 :(得分:0)

变量(char *)的值正在更改,您可以使用calloc函数为它分配内存,因为calloc将提供连续的内存块,现在,如果您使用malloc,它将不提供已经分配的地址。