2011-10-16 18 views
0

我有一个函数可以在数组中生成值并返回指向该数组的指针。这里的MWE代码:无法使用由C++中的函数返回的数组

int *f(size_t s) 
{ 
    int *ret=new int[s]; 
    for(size_t a=0;a<s;a++) 
    { 
    ret[a]=a; 
    cout << ret[a] << endl; 
    } 
    return ret; 
} 

注意,我有一个cout线在该阵列被正确填充for循环来证明自己。

现在,这是我的问题。我找不到使用返回数组的正确方法。这是我一直在做的事情:

int main (void) 
{ 
int ary_siz = 10; 
int ary[ary_siz]; 
*ary = *f(ary_siz); 
cout << ary[0] << endl; 
cout << ary[2] << endl; 
cout << ary[3] << endl; 
} 

ary的第一要素似乎是正确的。其他人(ary[1]ary[2] ...)没有。谁能告诉我我做错了什么?

+0

在回答了答案中提出的观点后,您可能会惊讶地发现'ary [1]'仍然没有打印出来。 –

+0

谢谢马塞洛。 ary [1],而且我从来没有过。 – bev

回答

4
int main (void) 
{ 
int ary_siz = 10; 
int *ary = f(ary_siz); 
cout << ary[0] << endl; 
cout << ary[2] << endl; 
cout << ary[3] << endl; 
delete [] ary; 
} 
+0

mmmm ...你偷了'delete []'部分:) – sehe

+0

不是故意的 - 只是在我发布第一个答案之后才想到它。首先发布+1即可。 –

+0

Vaughn(和sehe) - Gracias amigos。这有效 - 它指出了我混乱的核心。大部分错误消息我都与类型错误有关(例如,“不能将int转换为int ... blah等等),并且在给出本问答的时候:http://c-faq.com/aryptr/aryptrequiv。 HTML,我认为问题是我只是没有得到什么样的返回类型。但是,在你的回答中,你没有声明一个指向int数组的指针来初始化返回的数组,你只需要一个普通的指针指向int。但是,那么你把它当作一个数组来对待,我认为我发布的问答非常不友好。 – bev

1

分配

*ary = *f(ary_siz); 

拷贝的单个元素。使用

int main (void) 
{ 
int ary_siz = 10; 
int *ary = f(ary_siz); 

delete[] ary; 
} 

固定内存泄漏以及

+0

谢谢sehe。当涉及到内存泄漏时,我有自己的内存泄漏:-)。 – bev

0

这个怎么样?

int *ary = f(ary_siz); 

您可以像使用cout一样使用[]运算符。

1

您在函数中分配一个数组,而您只是将其第一个元素分配给堆栈分配数组的第一个元素,而不是仅使用返回的数组。

你应该做类似的东西:

int main (void) 
{ 
int ary_siz = 10; 
int *ary; 
ary = f(ary_siz); 
cout << ary[0] << endl; 
cout << ary[2] << endl; 
cout << ary[3] << endl; 
delete[] ary // don't forget to release the memory 
return 0; // You should return something in the main function 
} 

而且,在C++中应该使用的,而不是“裸机”阵列载体只要有可能。

+0

也可以使用'std :: array <>'(除了'std :: vector <>')。另外,'main'不需要返回值;在没有明确的'return'语句的情况下默认返回'0'。 – ildjarn

+0

从未听说过std :: array:它是C++ 11的一个新特性吗?至于缺失的“回报”声明,我认为这是不好的风格,更多的是表明忘记明确的回报。 – akappa

+0

'std :: array <>'是TR1的'std :: tr1 :: array <>'的C++ 11实现,而TR1的实现则是Boost的'boost :: array <>'。至于缺少'return',我认为应用程序的返回代码具有任何相关性或含义是非常不寻常的,所以它应该只存在于非默认返回值中。但是,这当然是完全主观的。 – ildjarn