publicint[][]getInfo(){int[][]result=newint[10][20];returnresult;}publicvoidmain(){int[][]result=getInfo();System.out.println("结果长度:"+result.length);for(inti=0;i
2 回答
凤凰求蛊
TA贡献1825条经验 获得超4个赞
比如,用点黑魔法之类的(C语言的黑魔法当然就是宏+指针)。之前就有人提出将一个数组的长度记在首地址前。#include #include typedefstructarray_meta_t{intlength;intelem_size;}array_meta;#defineTO_META(array)(((array_meta*)array)-1)#defineTO_ARRAY(meta)((void*)(meta+1))void*array_allocate(intlength,inttype_size){array_meta*new_array=malloc(length*type_size+sizeof(array_meta));new_array->length=length;new_array->elem_size=type_size;returnTO_ARRAY(new_array);}#definearray_length(array)(TO_META(array)->length)#definearray_type_size(array)(TO_META(array)->elem_size)#definearray_create(type,length)((type*)array_allocate(length,sizeof(type)))#definearray_release(array)(free(TO_META(array)))int**return_some_array(){int**my_array=array_create(int*,10);intvalue=0;for(inti=0;imy_array[i]=array_create(int,20); returnmy_array;}intmain(){int**result=return_some_array();printf("Thearrayhassize%dx%d\n",array_length(result),array_length(*result));//Output:Thearrayhassize10x20for(inti=0;iarray_release(result[i]); array_release(result);}这种方法相比起返回一个结构体指针有三个好处:元信息结构体对用户是隐藏的(有点像面向对象里的私有域),这里array_length是宏所以可写,改写成函数就是只读了可以用传统的[]操作符直接取偏移,而不需要先解引用之类的还有一个就是,如果返回一个结构体,相当于要动态分配两次,内存管理起来更加麻烦。这里只需要malloc一次,然后释放一次就好了。C++的话就不用费事用vector了,用两个模板元把不同长度的数组重载开,搞定。记得参数是引用:template voidprint_length(int(&)[M][N]){cout<} //...intarr[5][6];print_length(arr);//Output:56
添加回答
举报
0/150
提交
取消