//返回一个结构 示例1
struct travel_time{
int hours;
int mins;
}
......
travel_time sum(travel_time t1, travel_time t2){
travel_time total;
total.mins = (t1.mins + t2.mins) % Mins_per_hr;
total.hours = t1.hours + t2.hours +
(t1.mins + t2.mins) / Mins_per_hr;
return total;
}
//返回一个数组 示例2
char *GetMemory( void )
{
char p[] = "hello world";
return p;
}
void Test( void )
{
char *str = NULL;
str = GetMemory();
printf( str );
}
c++能返回结构而不能返回数组
对于示例1来说,total仅仅是一个结构名,而不是一个结构的地址,&total才是结构的地址;对于示例2来说,p不仅仅是一个字符数组(字符串)的名字,还是这个字符数组(字符串)的首个字符的地址。
当示例2试图返回数组p时,Tes函数的str变量只是的到了p指针的一个拷贝,由于GetMemory结束后,被函数调用栈弹出,原先p指向的字符串“hello world”占用的内存已经被收回。Test无法通过p指针的拷贝str, 再次访问到“hello world”字符串。
示例1和示例2相比,可以看出:函数可以像返回int型变量一样返回结构型变量。而不能像返回int型变量一样返回数组型变量(至少静态联编不行)。也就是说,c++结构比数组的行为更接近基本的“单值变量”。
要想返回数组,或者说,返回指向数组的指针(可以说是数组名,或者数组第一个元素的地址),就不能使用系统栈来保存数组,避免函数一结束,数组占用的内存就被收回。不使用像“ int a[8] char [4]"这种方式声明,定义的数组?对的,我们将使用动态内存。使用free或者new运算符调用库函数为我们分配一段动态内存,这段内存来自堆空间一处略长的(物理上不连续的,更像链表)地址。举个例子:
像
int* itemp = new int;
//将返回一段int类型大小的堆内存的首地址, 赋值给iptr
double dtemp = new double;
//将返回一段double类型大小的堆内存的首地址, 赋值给dptr
char* cptr = new char[12];
//将返回一段有12个char类型大小的堆内存的首地址, 赋值给cptr
char *GetMemory( void )
{
char* p = new char[12];
p = "hello world";
return p;
}
void Test( void )
{
char *str = NULL;
str = GetMemory();
printf( str );
delete[] p;
p = nullptr;
}



