为了账号安全,请及时绑定邮箱和手机立即绑定

C语言的函数如何返回二维数组,并获取返回的二维数组大小

C语言的函数如何返回二维数组,并获取返回的二维数组大小

天涯尽头无女友 2019-04-14 10:35:23
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:Thearrayhassize10x20
for(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
                            
查看完整回答
反对 回复 2019-04-14
?
三国纷争

TA贡献1804条经验 获得超7个赞

给楼主一个方法,我测试出来的,如果报错请根据环境调试
inta[5][6];
intlength=((int)&a)+1-(int)&a;
                            
查看完整回答
反对 回复 2019-04-14
  • 2 回答
  • 0 关注
  • 2042 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信