C:调用free时,未分配被释放的指针

C:调用free时,未分配被释放的指针,c,C,我的职能: Shot *shot_collide(Shot *shot) { Shot *moving, *remaining; remaining=NULL; moving=shot; while(moving!=NULL) { if(moving->y>658) //ha eléri az alját { if(remaining==NULL) //ha ez az első el

我的职能:

Shot *shot_collide(Shot *shot)
{
    Shot *moving, *remaining;
    remaining=NULL;

    moving=shot;
    while(moving!=NULL)
    {
        if(moving->y>658) //ha eléri az alját
        {
            if(remaining==NULL)  //ha ez az első elem
            {
                shot=moving->next;
                free(moving);
                moving=shot->next;
            }else{

            remaining->next=moving->next;
            free(moving);
            moving=remaining->next;
            }
        }else{
            moving=moving->next;
        }

    }

    return shot;
}
当我调用free时,我在Xcode中遇到以下错误:

NHF1670,0x7fff77e1a300 malloc:*对象0x10050c9e0的错误:释放的指针>未分配 *在malloc\u error\u break中设置断点以进行调试

这是一个SDL游戏,这个功能是免费的拍摄后,它到达地图的结尾

我必须在星期天完成这项工作,但我被卡住了:

你有个bug

传递给free的值必须是malloc返回的值或相关函数之一

我看到您正在修改移动变量,但我认为我没有足够的上下文来确切地告诉您需要更改什么

但是传递给free的值显然不是malloc返回的值。

EDIT 2

查看代码中的第110行和第113行。创建移动,然后设置moving=shot,然后在第121行上自由移动。在该转换块中,您从未对其使用malloc或calloc。这就是为什么你会犯错误。不要在翻译块中释放它。您可能需要在调用函数中释放快照,或者在任何有内存的地方释放快照

编辑 如果在代码中创建了moving,然后将moving更改为指向与最初返回的位置不同的位置,则问题的原因可能不同。见插图:

char *string = {0};
string = calloc(10, 1);//see 1)
string++;//see 2)
free(string);//see 3)  
1字符串在内存中可能如下所示:

  0x000BCA00
 >|< (pointer position returned from calloc)
  |0|0|0|0|0|0|0|0|0|0|  
3 0x000BCA00!=0x000BCA04,因此free将不起作用

结束编辑

如果编译并运行:

int main(void)
{

    char *p = malloc(10);
    p++;  //pointer is no longer what malloc returned, so free will not work
    free(p);fails here
    return 0;
}  
您可能会收到您描述的错误消息。 我得到这个:


查看代码以识别类似的情况。更好的方法是,按照编译器错误消息的说明进行操作:在malloc_error_break中设置一个断点以进行调试

在创建指针和尝试释放指针之间移动指针。您没有显示足够的代码来允许编译和运行测试,因此很难确定。但是如果你做了类似于char*p=malloc10;,的事情;,然后p++;,然后弗里普;您可能会得到您描述的错误。您在粘贴箱中的哪一行得到您描述的错误?正在释放的指针>未分配*在malloc\u error\u break中设置一个断点以调试是否遵循了消息指令?121。第一个功能是免费的,我试着在问题中写下了。我明白了:我下面的回答并没有完全解决您的具体问题。我想我把真正的问题说错了。您真正的问题是,在translation unit函数中,您看到了错误消息,创建了moving,分配了一个值,然后尝试释放,而没有调用calloc或malloc来分配内存。我想这就是你发出错误信息的原因。很抱歉之前的混乱。你告诉我,你没有足够的上下文,所以我给你发送了一个更大的上下文,所以我希望你能找到小错误,我的调试程序和我在2小时内找不到的。这不是我的全部代码。我告诉过你的是stackoverflow是一个完整的问题。对不起,我有付费客户,我不能从工作中抽出时间来调试你的程序。我认为调试这个问题并不难。我告诉过你是什么引起的。你需要看看在哪里发生的。我想我的链接列表中有些错误。我的调试程序什么也没告诉我,所以我在搜索它。无论如何谢谢你@fzsombor-查看代码中的第110行和第113行。创建移动,然后设置moving=shot,然后在第121行上自由移动。在该转换块中,您从未对其使用malloc或calloc。这就是为什么你会犯错误。不要释放它。您可能需要在调用函数中释放快照,或者在任何有内存的地方释放快照。如果您复制变量中的指针,并将该变量释放,它不需要释放它指向的内存吗?您只在使用malloc、calloc或realloc最初分配内存的指针变量上使用free。所以,答案是否定的,不要在那个块中自由移动:。我需要在它碰撞时释放它。所以我不能在调用alloc的地方释放它,因为这个函数只是创建快照。
int main(void)
{

    char *p = malloc(10);
    p++;  //pointer is no longer what malloc returned, so free will not work
    free(p);fails here
    return 0;
}