所以我使用下面的代码,其中函数调用如下所示(注意字符串文字):
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行""修复"" (不是报价,我知道它不是一个真正的解决方案)问题。为什么呢?
答案 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,它将不提供已经分配的地址。