因为在工作中踩到了指针相关的坑,所以在这里记录下来问题产生的原因,以免再次遇到同样的错误。如果你对文章中的观点、内容存在不一样的看法,欢迎通过关于博主页面中的Email与我联系。
需求:
将代码提取成函数,代码如下:
mr_cfg_bsc_info_t *mir_list = NULL;
mir_list在主函数中是一级指针的形式,我提取函数时接口用了二级指针如下格式:
int32_t mirror_suspend_flag_abnormal_handle(mr_cfg_bsc_info_t *mir_info,lun_info_t *lun_info,uint32_t mir_num,mr_cfg_bsc_info_t **mir_list)
复制原有的代码:
found_rmt_cfg = FALSE;
for (rmt_cfg_idx = 0; rmt_cfg_idx < mir_num; rmt_cfg_idx++)
{
rmt_cfg = &mir_list[rmt_cfg_idx];
if(0 == memcmp(&mir_info->remote_uuid, &rmt_cfg->local_uuid, sizeof(uuid_t)))
{
found_rmt_cfg = TRUE;
break;
}
}
将rmt_cfg = &mir_list[rmt_cfg_idx];修改成rmt_cfg = mir_list[rmt_cfg_idx];
我自以为自己简化了代码,使函数主题看起来更清晰,却哪知道埋下了一个定时炸弹.
要分析上述问题,我们先从最基本的指针知识说起.
指针数组与数组指针
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
数组指针:a pointer to an array,即指向数组的指针
还要注意的是他们用法的区别,下面举例说明。
int* a[4] 指针数组 表示:数组a中的元素都为int型指针
元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
int (*a)[4] 数组指针 表示:指向数组a的指针
元素表示:(*a)[i]
/*
Name: 指针数组与数组指针
Copyright: 52coder.net
Author: 52coder
Date: 03/06/17 17:24
Description: pointer
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定义指针数组,数组的每一个元素都是指向int的指针
int *a[10];
int i = 0;
int var = 10;
a[0] = &var;
//这里*a[0]与*(a[0])相同,原因是[]优先级高于*
printf("%d\n",*a[0]);
printf("%d\n",*(a[0]));
//定义数组指针
int arr[10]={0,1,2,3,4,5,6,7,8,9};
int (*b)[10];
b=&arr;
for(i=0;i<10;i++)
{
printf("%d ",(*b)[i]);//此处必须使用(),原因是先解引用,然后索引.
}
return 0;
}