所以,我只是编写了一个插入排序来对链接列表进行排序(使用虚拟单元格)。
它工作得很好,但是,在代码的末尾,如果我在用作辅助的指针中使用 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] 删除。
我来说两句