c++函数返回数组

前两天应聘,做了些笔试题。遇到返回值的问题。。涉及到返回数组。。回来后查了查资料总结如下。

不能返回局部数组,因为它是临时变量,暂存在栈区里面,函数调用结束,数组会被释放。

如果需要返回数组可以用如下3种方法:

(1)调用之前先创建数组,将数组的地址也就是指针作为参数传递进函数。

int *GetData(String S,int& arr[])
{
 int j=0; 
 for(int i=1;i<S.Length();i++)
 {
    if(S.SubString(i,1)==".")
    {
      arr[j]=i;
      j++;
     }
 }
 return arr;//反不返回都行,可以直接使用参数
}

(2)在函数中定义静态数组

#define MAX 1024
char * getInfo(){
static char info[MAX];
……
Your code
……
return info;
}

(3)函数中定义数组指针,然后对指针进行分配空间,此时的内存空间是在堆区(注意要自行释放)

#define MAX 1024
char *getInfo(){
char *info;
info=(char *)malloc(MAX*sizeof(char));
……
Your code
……
return info;
}

另外:

局部对象可以返回
  因为C++中使用临时复制对象来传值的缘故.例如: 局部string Str 对象,return Str;时C++会用一个临时复制对象来保存Str的值,接着Str的生存期结束,然后临时对象的值被赋给调用处,最后临时复制对象的生存期结束,通过汇编代码会看到返回的时候会再构造一个对象,最后析构2次,但是第二次析构的时候临时对象已经复制到调用处了。

004518E8  call        dword ptr [__imp_std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> > (47E7F0h)] 
004518EE  cmp         esi,esp 
004518F0  call        @ILT+4760(__RTC_CheckEsp) (42529Dh) 
004518F5  mov         ecx,dword ptr [ebp-118h] 
004518FB  or          ecx,1 
004518FE  mov         dword ptr [ebp-118h],ecx 
00451904  mov         byte ptr [ebp-4],1 
00451908  mov         esi,esp 
0045190A  lea         ecx,[ebp-4Ch] 
0045190D  call        dword ptr [__imp_std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> > (47E7CCh)] 
00451913  cmp         esi,esp 
00451915  call        @ILT+4760(__RTC_CheckEsp) (42529Dh) 
0045191A  mov         byte ptr [ebp-4],0 
0045191E  mov         esi,esp 
00451920  lea         ecx,[ebp+0Ch] 
00451923  call        dword ptr[__imp_std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>::~basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >(47E79Ch)]


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值