c:释放mallocated对象错误

时间:2016-10-05 19:33:12

标签: c

好的,所以我有一个方法,我打电话。被调用的方法返回char*,它在被调用的方法中分配。将返回的char*分配给新的char*后,我想在使用后将其释放。但Xcode抱怨并抛出错误。它说我试图释放的对象没有分配,我没有得到,因为我确定我已经分配了它。

这是我的代码:

void print_r()
{

    char *stateA = isActive(ruter_array[id]->flagg);

    //print out the results etc

    free(stateA);     <-----The program crashes here.


}

char * isActive(unsigned char a_flag)
{
    char *ret = malloc(5);

    if((a_flag & 1) == 1)
    {
        //is active
        ret = "yes";
        return ret;
    }
    ret = "no";
    return ret;

}

了解这是什么并不重要,但为什么这次崩溃会崩溃?

3 个答案:

答案 0 :(得分:3)

ret = "no";

覆盖指针。改为:

strcpy(ret, "no");

同样适用于"yes"案例。

另外,正如@DavidSchwartz指出的那样,为了您的目的,可能没有必要使用动态分配的内存。可以直接返回字符串文字:

char * isActive(unsigned char a_flag)
{
    if((a_flag & 1) == 1)
    {
        //is active
        return "yes";
    }
    return "no";  
}

当然,在这种情况下,来电者不应该free返回的值。

答案 1 :(得分:2)

您分配了一些内存并将该内存的第一个地址分配给指针ret,但"no""yes"是在编译时静态存储在内存中的字符串文字。执行ret = "no"时,更改指针,使其现在指向字符串文字"no"的第一个字符。所以,现在你已经失去了对你分配的内存的访问权限,并且你有内存泄漏。但崩溃是因为你试图释放未被malloc()或其中一个朋友分配的内存。

答案 2 :(得分:1)

您甚至可以使用strdup

char * isActive(unsigned char a_flag)
{
    return strdup((a_flag & 1) == 1 ? "yes" : "no");
}

如写here,指针仍然通过malloc分配,因此它也可以被释放。