2010-04-01 84 views
0

我试图创建一个tm *结构体的数组,然后在函数结束时返回它们。这就是我目前的样子:从函数返回一个tm *结构体的数组

struct tm* BusinessLogicLayer::GetNoResponceTime() 
{ 
    struct tm* time_v[3]; 
    struct tm* time_save; 
    int s = 3; 
    time_save = LastSavedTime(); 
    time_v[0] = time_save; 
    sleep(5); 
    time_save = LastSavedTime(); 
    time_v[1] = time_save; 
    sleep(5); 
    time_save = LastSavedTime(); 
    time_v[2] = time_save; 

    return time_v; 
} 

我明白,既然有代码,我现在就不可能返回数组,因为当函数结束它会被销毁。任何人都可以帮助我关于如何能够在函数结束后从返回值访问数组?

问候

保罗

+0

你的意思或者“'tm'结构数组”,“一个“tm *'指向结构的指针”数组? – MSalters 2010-04-01 12:32:51

+0

tm * – paultop6 2010-04-01 12:46:20

回答

4

无论是在堆上分配的数组,但你需要记住delete[]数组,当你使用完。

tm* time_v = new tm[3]; 

或者因为这是C++,更好的选择是使用一个vector

std::vector<tm> time_v(3); 

本身在堆栈上分配的载体,但它保持其在堆上分配的阵列。当你复制矢量(例如返回它)时,底层数组的内容也被复制。

您还可以通过不使用临时变量time_save

time_v[0] = *LastSavedTime(); 
sleep(5); 

time_v[1] = *LastSavedTime(); 
sleep(5); 

time_v[2] = *LastSavedTime(); 

的C风格的结构声明也没有用C需要++

struct tm* time_v[3]; 

//should be 
tm* time_v[3]; 
+0

不应该是'std :: vector time_v(3);'和同样是'new'变种? – 2010-04-01 12:27:17

+0

这对我来说似乎没问题 – Elemental 2010-04-01 12:34:30

+0

@Andreas这远远不止是给出的代码示例,但是我会怀疑,它似乎应该不是一个不使用指针的问题。 – Yacoby 2010-04-01 12:39:27

4

创建副本,并返回,而不是简化的功能:

vector<tm> ret; 
struct tm* time_save; 

time_save = LastSavedTime(); 
ret.push_back(*time_save); 

Sleep(5); 
time_save = LastSavedTime(); 
ret.push_back(*time_save); 

Sleep(5); 
time_save = LastSavedTime(); 
ret.push_back(*time_save); 

return ret; 

显然,您需要更改签名。

0

对不起保罗,在轻微的着急,但是试试这个...

struct tm* time_v = new struct tm[ 3 ]; 

这将分配结构适合你,那么你就对其进行初始化,并返回按你的函数提供的代码。

但是我想提醒你,一旦它是没有必要的,请使用“删除”

希望这有助于释放内存 - 尼尔