函数指针

来源:互联网 发布:ubuntu查看分区挂载点 编辑:程序博客网 时间:2024/06/05 00:38

事实上,函数名出现在赋值符号右边就代表着函数的地址

int function(int argc){ /*...*/}...int (*p_fun)(int) = function;int (*p_fuc)(int) = &function;//和上一句意义一致

上述代码即声明并初始化了函数指针,p_fun的类型是指向一个返回值是int类型,参数是int类型的函数的指针

p_fun(11);(*p_fun)(11);function(11);

上述三个代码的意义也相同
同样我们也能使用函数指针数组这个概念

int (*p_func_arr[])(int) = {func1, func2,};

其中func1,func2都是返回值为int参数为int的函数,接着我们能像数组索引一样使用这个函数了。

我们常常见到这种写法:

int* pointer = (int*)malloc(sizeof(int));

这有什么奇怪的吗?看下面这个例子:

int* pointer_2 = malloc(sizeof(int));

哪个写法是正确的?两个都正确,这是为什么呢,这又要追求到远古C语言时期,在那个时候, void* 这个类型还没有出现的时候,malloc 返回的是 char* 的类型,于是那时的程序员在调用这个函数时总要加上强制类型转换,才能正确使用这个函数,但是在标准C出现之后,这个问题不再拥有,由于任何类型的指针都能与 void* 互相转换,并且C标准中并不赞同在不必要的地方使用强制类型转换,故而C语言中比较正统的写法是第二种。注:C++中的指针转换需要使用强制类型转换

对于内存的理解

在内存分配的过程中,我们使用 malloc 进行分配,用 free 进行释放,但这是我们理解中的分配与释放吗? 在调用 malloc 时,该函数或使用 brk() 或使用 nmap() 向操作系统申请一片内存,在使用时分配给需要的地方,与之对应的是 free,与我们硬盘删除东西一样,实际上:

int* value = malloc(sizeof(int)*5);...free(value);printf("%d\n", value[0]);

代码中,为什么在 free 之后,我又继续使用这个内存呢?因为 free 只是将该内存标记上释放的标记,示意分配内存的函数,我可以使用,但并没有破坏当前内存中的内容,直到有操作对它进行写入。

这便引申出几个问题:
1、Bug更加难以发现,让我们假设,如果我们有两个指针p1,p2指向同一个内存,如果我们对其中某一个指针使用了 free(p1); 操作,却忘记了还有另一个指针指向它,那这就会导致很严重的安全隐患,而且这个隐患十分难以发现,原因在于这个Bug并不会在当时显露出来,而是有可能在未来的某个时刻,不经意的让你的程序崩溃。
2、有可能会让某些问题更加简化,例如释放一个条条相连的链表域。

0 0
原创粉丝点击