因为在工作中踩到了指针相关的坑,所以在这里记录下来问题产生的原因,以免再次遇到同样的错误。如果你对文章中的观点、内容存在不一样的看法,欢迎通过关于博主页面中的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;
}