所以,我刚刚编码了一个插入排序来对链接列表(带有哑单元)进行排序。
它工作得很好,但是在代码的结尾,如果我在用作辅助的指针中使用free(),那么它也是一个单元格(循环中最后一个it指针)也是免费的。
因此,为了避免释放单元格,首先我将指针指向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
以及为什么它当前正在发生?
答案 0 :(得分:1)
您对指针在C中的工作方式有一个误解。声明指针时,就像声明任何其他变量一样。 如果您在本地声明一个指针(在函数内部,而没有诸如静态的修饰符),则它所占据的内存位置将由C语言为您抽象的较低层处理。一种常见的实现方式是使用堆栈,当您在本地声明变量时,将在调用函数时将其压入堆栈,并在函数返回后将其弹出堆栈,因此无需担心释放您的代码。指针。
但是,指针指向某个内存位置,当您使用malloc之类的函数时,它将为您分配一个空闲内存块,并且指针指向该块的第一个位置。现在,该块将仅在您释放时返回到空闲块列表。因此,一旦使用完该内存位置,就应该释放它。
当您这样做时:
temp = NULL;
free(temp);
您试图释放NULL内存位置,这没有任何意义。 因此,一旦不再需要它,您将只释放它。
我建议您搜索更多有关C语言中的变量和指针的信息,此链接可能会帮助您: enter link description here