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内部获取到数组的真实长度呢?
首先纠正一个错误,在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;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。