函数调用时 传参 传 地址 归其原因
- 实参和形参是各占独立存储空问。
- 函数调用过程中,实参向形参拷贝复制值。
- 实参是个变量,形参也是个变量。如果占用同一片空间的话,编译时候就不存在实参形参类型不匹配的报错参数传递中,形参值的改变不影响实参的值
疑问为什么数组 形参 实参 地址空间一致:
当数组名作为函数的形参是,这个两个数组就共占同一段内存单元,在存储空间上完全重合(虚实结合)。因为数组名实质上是常指针,即便它作为参数,它指向地址是不会改变的(传参的时候实际上是临时拷贝了一份指针,但是指向的地址不变),所以就共占一段内存单元(指针指向的那块内存)
我们理解的时候可以认为实参数组与形参数组在储存空间上完全重合。
malloc kmalloc 区别
malloc
- malloc函数是C标准库中的函数,主要用于在用户空间中分配动态内存。
- 该函数通过向操作系统请求内存,获取一块连续的用户空间内存区域,并返回一个指向该内存区域的指针。
- 使用完该内存区域后,需要通过调用free函数将内存归还给操作系统。
应用场景
像之前用户空间自己的定义的链表
typedef struct node{ data_t data; //存储数据 struct node *next; //存储下一个节点的地址 }linknode_t;
需要用到 malloc
kmalloc
- kmalloc函数是Linux内核中的函数,主要用于在内核空间中分配动态内存。
- 该函数通过在内核内存管理区域中分配一块连续的内核空间内存区域,并返回一个指向该内存区域的指针。
- 使用完该内存区域后,需要通过调用kfree函数将内存归还给内核内存管理机制。
应用场景
像在sdwan项目中,用到的内核链表需要用kmalloc申请空间
混用的结果
内核编程中,需要使用kmalloc和kfree来管理内核中的动态内存,而不能使用标准C库中的malloc和free函数。
这是因为在内核中,访问用户空间的内存需要通过一定的特殊处理,而直接使用malloc和free函数可能会引起一些未定义的行为和不可预知的问题。