如何在不破坏列表的情况下释放指针?

马修苏扎

所以,我只是编写了一个插入排序来对链接列表进行排序(使用虚拟单元格)。

它工作得很好,但是,在代码的末尾,如果我在用作辅助的指针中使用 free(),它也是我的单元格之一(循环中的最后一个指针)是免费的。

所以为了避免它释放我的单元格,首先我将指针指向 NULL,但这是我的问题:如果我没有指向 NULL,它不应该只释放指针而不是我的单元格吗?

这是我的功能

void 
insertSort(cel *lst){
    cel *temp = NULL;
    cel *ordenado = lst->prox;

    while(ordenado){
        cel *valorOrdenando = ordenado->prox;

        // removendo o valorOrdenado da lista
        ordenado->prox = valorOrdenando->prox;

        for (cel* i = lst; i != ordenado->prox; i = i->prox)
        {
            if (valorOrdenando->valor <= (i->prox)->valor || i->prox == ordenado->prox){
                temp = i->prox;
                i->prox = valorOrdenando;
                valorOrdenando->prox = temp;

                break;
            }
        }
        ordenado = ordenado->prox;

    }
    // and here is where I point to NULL, otherwise I lost a cell
    temp = NULL;
    free(temp);
}

这是代码的另一部分:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



struct cel {
    int valor;
    struct cel *prox;
}typedef cel;


void inserir (cel **lista, int x) {
    cel *temp = NULL, *aux = *lista;

    temp = malloc(sizeof(cel));
    temp->valor = x;
    temp->prox = NULL;


    if (*lista == NULL)
      *lista = temp;
    else {
      for (; aux->prox != NULL; aux = aux->prox);
      aux->prox = temp;
    }
 }

 void imprimir(cel *lista) {
    for (cel *aux = lista; aux != NULL; aux = aux->prox)
        printf("%d ,", aux->valor);
    printf("\n");
}

int main(){
    cel *list = NULL;

    inserir(&list, 3);
    inserir(&list, 2);
    inserir(&list, 1);
    inserir(&list, 8);
    inserir(&list, 6);
        insertSort(list);
        //bubbleSort(list->prox);
    imprimir(list->prox);
    return 0;
}

我应该如何编码以便我不需要用户*temp = NULL以及为什么它目前正在发生?

加布里埃尔·斯鲁兹

你对指针在 C 中的工作方式有误解。当你声明一个指针时,就像声明任何其他变量一样。如果你在本地声明一个指针(在函数内部,没有像 static 这样的修饰符),它所占据的内存位置将由 C 语言为你抽象的较低层处理。一种常见的实现是使用堆栈,当你在本地声明一个变量时,它会在函数被调用时被压入堆栈,并在函数返回后从堆栈中弹出,因此无需担心释放你的指针。

但是,指针指向某个内存位置,当您使用像 malloc 这样的函数时,它会为您分配一个空闲内存块,并且指针指向该块的第一个位置。现在该块只会在您释放它时返回到空闲块列表。所以一旦你用完那个内存位置,你应该释放它。

当你这样做时:

temp = NULL;
free(temp);

您试图释放 NULL 内存位置,这是没有意义的。因此,您只会在不再需要内存时释放它。

我建议你在 C 语言中搜索更多关于变量和指针的信息,这个链接可能对你有帮助:在此处输入链接描述

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不复制列表的情况下将列表传递给线程而不破坏它

如何在不破坏列表的情况下修改链接列表元素的值

如何在不破坏对象的情况下返回对象列表

如何在不破坏AnonymousQueue的情况下暂停@RabbitListener

如何在不破坏循环的情况下返回变量?

如何在不破坏依赖的情况下删除ImageMagick?

如何在不破坏画布的情况下刷新数据

如何在不破坏 GPT 分区表(结束指针)的情况下截断未使用空间的磁盘映像文件

如何在不从哈希表/链接列表中删除值的情况下释放calloc'd指针?

在Microsoft Word中,如何在不破坏交叉引用的情况下更改枚举列表中项目的顺序?

如何在不取消引用指针的情况下返回指针的指针值?

如何在不覆盖值的情况下映射列表

如何在不丢失元素的情况下遍历列表

如何在不释放鼠标键的情况下更改所选文本

Perl:如何在不访问Perl变量的情况下释放为标量分配的内存?

如何在不释放Lisp的情况下抓住读写锁?

如何在不释放元素的情况下从 unordered_set 中删除元素

如何在不破坏标签文本的情况下缩短数字输入框的输入字段?

如何在不破坏封装的情况下返回对RefCell内部内容的引用?

如何在不破坏链接的情况下替换部分 url?

如何在不破坏客户端代码的情况下拆分大型程序包?

如何在不破坏文件的情况下从流写入文件?

如何在不破坏响应性的情况下增加边距

如何在不破坏gradle的情况下更新外部jar文件?

如何在不破坏图像、CSS 和 JavaScript 的情况下实现友好的 URL?

如何在不破坏 <div> 的宽度或布局的情况下将 <div> 包裹在 <a> 中?

如何在不破坏结构的情况下重命名Keras模型的图层?

Visual Studio如何在不破坏IEnumerator <T>的MoveNext的情况下评估IEnumerable?

如何在不破坏主题的情况下真正隐藏ListViewItem?