我一生中一直是系统管理员,但最近决定练习一些我的开发知识并尝试担任devops职位。因此,我一直在练习一些C和Python技能,并编写了一些代码以将数字插入到链表中。
void list_insert(struct list *h, int d)
{
struct list *elem = malloc(sizeof(struct list));
elem->data = d;
elem->next = NULL;
if (!h) {
h = elem;
} else {
elem->next = h;
h = elem;
}
}
我注意到该函数似乎并没有改变变量h的外部视图(即传递给list_insert的任何东西),并且我注意到在insert函数末尾进行打印似乎可以工作。因此,尝试在网上寻找答案后,我什么都找不到,很明显,但是我发现大多数列表实现都带有双指针。我将函数更改为使用双指针,然后突然开始工作。有人可以帮我了解这里发生的事情,因为我知道指针管理是一个重要的概念,并且我想我了解指针是什么以及它与内存的关系,但是我不明白为什么不更改单个指针,而双指针可以。
谢谢!
在C语言中,函数的参数由值传递。甚至指针也由值传递。
例如:
#include<malloc.h>
#include<stdio.h>
int allocatingMemory(int* ptr)
{
ptr = malloc(sizeof(int));
if(ptr==NULL)
return -1;
else
return 0;
}// We are not returning the pointer to allocated memory
int main(void)
{
int* ptr;
int allocated = allocatingMemory(ptr);
if(allocated == 0)
{
*ptr = 999;// Boom!!!
free(ptr);
}
return 0;
}
为了克服这个问题,我们使用
int allocatingMemory(int** ptr)
{
*ptr = malloc(sizeof(int));
if(*ptr == NULL)
return -1;
else
return 0;
}
int main(void)
{
int* ptr;
int isAllocated = allocatingMemory(&ptr);
if(isAllocated == 0)
{
*ptr = 999;
free(ptr);
}
return 0;
}
如果您使用linked list
s并说出例如,您想修改头部。您将向传递pointer to pointer
(注意,它不被称为双指针)head node
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句