鹏哥c指针

  • static void cpuset_fork(struct task_struct* task)
    
    {
    	if (task_css_is_root(task, cpuset_cgrp_id))
    		return;
    
    	set_cpus_allowed_ptr(task, &current->cpus_allowed);
    #ifdef CONFIG_QOS_SCHED_DYNAMIC_AFFINITY
    	set_prefer_cpus_ptr(task, current->prefer_cpus);
    #endif
    	task->mems_allowed = current->mems_allowed;
    }
    
    void cgroup_fork(struct task_struct* child)
    {
    	RCU_INIT_POINTER(child->cgroups, &init_css_set);
    	INIT_LIST_HEAD(&child->cg_list);
    }
    
    struct kprobe {
    	struct hlist_node hlist;
    	struct list_head list;
    	unsigned long nmissed;
    	kprobe_opcode_t *addr;
     	const char *symbol_name;
    	unsigned int offset;
    	kprobe_pre_handler_t pre_handler;
    	kprobe_post_handler_t post_handler;
    	kprobe_fault_handler_t fault_handler;
    	kprobe_break_handler_t break_handler;
    	kprobe_opcode_t opcode;
    	struct arch_specific_insn ainsn;
    	u32 flags;
    };
    指针:存地址32个平台,4个字节

static struct kprobe kp = {
	.symbol_name	= "cpuset_fork",
};
 
static int __init kprobe_init(void)
{
	int ret;
	kp.pre_handler = handler_pre;
	kp.post_handler = handler_post;
	kp.fault_handler = handler_fault;
 
	ret = register_kprobe(&kp);
	if (ret < 0) {
		printk(KERN_INFO "register_kprobe failed, returned %d\n", ret);
		return ret;
	}
	printk(KERN_INFO "Planted kprobe at %p\n", kp.addr);
	return 0;
}
 
static void __exit kprobe_exit(void)
{
	unregister_kprobe(&kp);
	printk(KERN_INFO "kprobe at %p unregistered\n", kp.addr);
}
 
module_init(kprobe_init)
module_exit(kprobe_exit)
MODULE_LICENSE("GPL");
  • 指针类型决定了指针在解引用是访问几个字节

指针类型决定指针+-1操作的时候跳过几个字节,决定指针的步长

int* 4byte   char* 1byte  float* 4byte 

  • 野指针:指向位置不可知;指针访问越界;局部变量被销毁

  • 指针
  1. 指针加减整数   *vp++=0  *vp=0;vp++;
  2. int sz=sizeof(arr)/sizeof(arr[0]);
    int*p=arr;
    for(i=0;i<sz;i++)
    { *p=1;
    p++;
    }

    2.指针减指针

指针减指针得到绝对值是指针和指针之间的个数

不是所有的指针都能相减,指向同一片空间的指针才能相减

        3.指针关系运算

*--vp=0;
vp--;
*vp=0;
#define n '5
float value[n]
float *vp
for (vp=&values[0];vp<&values[n];)
{
  *vp++=0;
}

允许向后越界,不允许向前越界

  • 指针和数组

数组名表示数组首元素地址

&arr[i]
*p[i]
*(arr+i)

arr[]也是首元素地址

  • 二级指针
int a=10;
int *pa=&a;
int **ppa=&a;

ppa指向的对象是int*类型

二级指针是用来存放一级指针变量的地址

  • 指针数组
  • 存放指针的数组就是指针数组
  • int a=0;
    int b=0;
    int c=0;
    
    int arr[10];
    int*pa=&a;
    int*pb=&b;
    int*pc=&c;
    inr *parr[10]={&a,&b,&c};

  • 结构体成员访问,

结构体变量.成员变量

结构体指针->成员变量

  • 结构体传参

传地址和传结构体

首选传地址。形参是实参的一个拷贝,传参的时候需要压栈,如果传递一个结构体,结构体过大,压栈的系统开销比较大,所以导致性能下降

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值