开发者社区> 问答> 正文

如何通过传入函数的指针获取对应的数组大小?

Hi,我有一个方法

void * x_array_map(void *func,char * arr){

    //void (*funcP)();
    //funcP=func;
    int len=sizeof(arr);
    printf("%d\n", len);
    // (*funcP)();    
}



另外我有一个char a[]={1,2,3},当我在外部的时候,我很容易可以通过,sizeof(a)/sizeof(a[0])来获取数组的长度,但是当我将该point传入x_array_map的时候,却无法获取到,sizeof(a),貌似变成了sizeof(&a)的值。
也就是说,

int main(void){
    char arr [3]={1,2,3};

    printf("%d\n",sizeof(arr));

    x_array_map(&func,arr);

    return SUCCESS;
}

在上面的代码中,printf的输出将是3,在x_array_map的内部输出的是4,也就是sizeof(&arr)的值,我知道它传入的是首地址,无法获取到准确的长度,除了结构体和在外部传入Len的方式,有没有其他方法在x_array_map内部获取到数组的真实长度呢?

展开
收起
a123456678 2016-06-08 21:53:02 2474 0
1 条回答
写回答
取消 提交回答
  • 首先纠正一个错误,在x_array_map中输出4的原因是,arr是一个指针,占用了4个字节(32位程序)。
    sizeof 是在编译的时候求值的,所以不能能够动态的确定一个变量的值。只有那些能够通过本文件中的定义能够确定的值才有可能(我说的是有可能)用 sizeof 求的,一般是依赖如何定义一个变量。比如x_array_map 中 arr定义为一个指针,所以求得的是指针占用的大小,在主程序中定义为一个数组,所以才是数组的大小。这里并不能认为数组名和指针没有区别,因为sizeof只能算是编译时候的一条预处理命令,可肯定是怎么定义方便写程序怎么定义(尽可能的)。或许这个关键字是 C 语言里最智能的命令了。

    对如malloc 分配的空间倒是可以动态的获取他的大小,因为malloc本身会分配额外的空间存储这个大小。

    // malloc  会在分配的空间之前返回这样一个结构体
    //struct mem_control_block {
    //    int is_available; 
    //    int size;            //这是实际空间的大小
    //};
    void getSize(void *ptr) 
    {
        struct mem_control_block *tp;
        tp = ptr - sizeof(struct mem_control_block);
        return tp->size;
    }
    2019-07-17 19:32:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载