2010-09-20 82 views
-1

爲什麼下面的代碼不起作用?如何在C++中返回數組?

它編譯罰款,但輸出的是像一個地址,如果我使用*f,輸出爲0如果我寫f沒有*

#include <iostream> 
#include<cstring> 
using namespace std; 
using std::size_t; 
int *f(size_t s){ 
    int *ret=new int[s]; 
    for (size_t a=0;a<s;a++) 
      ret[a]=a; 
     return ret; 
     } 
int main(){ 

    size_t s=20; 
    cout<<*f(s)<<endl; 

    return 0; 
} 
+0

請張貼的代碼。 – 2010-09-20 12:07:22

+0

它應該做什麼? – sje397 2010-09-20 12:10:40

+10

你已經在這裏問了十幾個問題,但仍然不知道如何格式化代碼?什麼讓你不能在編輯框旁邊提示? – sbi 2010-09-20 12:11:43

回答

0

獲取數組出功能的最好辦法是通過給作爲輸入參數對它的引用(即指針傳遞給數組的開始),那麼一旦你的功能齊全,你傳入的數組將被該函數填充。我甚至不會建議嘗試返回一個。

另一種類似STL向量(http://www.cplusplus.com/reference/stl/vector/)類或類似的變體,可以返回,但它取決於你打算使用它。

+0

這是一個動態分配的數組。代碼應該正常工作。 – sbi 2010-09-20 12:15:31

+0

我總是被教導,返回一個在函數中創建的數組是不好的做法。這似乎有點混亂。 – n00dle 2010-09-20 12:17:48

+0

啊,我明白你的意思了。好的,是的,上調codaddict。 – n00dle 2010-09-20 12:19:36

2

F(S)返回一個int *所以* F(S)是int(分配的數組的第一個項目)與值0。這就是它應該出現的東西,只是一個0

0

你不能使用<<運算符輸出數組。您必須創建一個for循環並打印每個條目。

f的輸出保存爲變量並打印每個條目。

12

您使用C++,只需使用std :: vector的,相反,它簡化了一切:

#include <iostream> 
#include <vector> 

std::vector<int> f(size_t s){ 
    std::vector<int> ret(s); 
    for (std::size_t a=0;a<s;a++) 
      ret[a]=a; 
     return ret; 
     } 
int main(){ 

    std::size_t s = 20; 
    std::vector<int> v = f(s); 
    for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) // go through each element 
     std::cout<< *it << std::endl; 

    for(int idx = 0; idx != v.size(); ++idx) // simpler variant that is equivalent in this example 
     std::cout<< v[idx] << std::endl; 


    return 0; 
} 
+1

這會錯過一些'std ::'前綴。儘管如此,我的「+ 1」。這是新手唯一明智的選擇。 – sbi 2010-09-20 12:20:34

+0

啊,是的,忘了解決這個問題後複製代碼粘貼現在應該被修復。 – Klaim 2010-09-20 12:51:45

+0

+1,但是,很多時候這是一個家庭作業的要求,不要觸摸標準容器 - 從經驗說起。 – Samaursa 2010-09-20 14:25:26

11

f(s)返回動態分配的數組的地址的功能。

如果你 cout<<f(s)<<endl;將打印地址,如果你這樣做cout<<*f(s)<<endl;它打印在指數0這是0值。

如果你想打印整個數組,運行一個循環爲:

int *p = f(s); 
for (size_t a=0;a<s;a++) { 
    cout<<*(p+a)<<endl; 
} 
2

這是比較容易理解的代碼時分爲2行:

int* ret = f(s); 
cout<<*ret<<endl; 

* RET = = ret [0] == 0.因爲它爲您發佈的代碼打印0。

*注意你正在分配一個數組(使用new),但是從不釋放它。

如果你的目的是要打印出數組中的所有元素,你可以使用下面的代碼:

size_t s=20; 
int* ret = f(s); 
for (size_t i = 0; i < s; i++) 
    cout<< ret[i] << " "; 
delete[] ret; 
+2

'delete ret'調用未定義的行爲,它應該是'delete [] ret'。 – fredoverflow 2010-09-20 15:20:22

+0

謝謝。相應地修復了答案。 – rkellerm 2010-09-20 15:32:24

2

由於@frag說,主()一無所知的f(s)類型的不同之處在於它是一個指向int的指針。它沒有任何理由尋找其他19個整數。

你的主要功能應該看起來更像是這樣的:

int main(){ 

    size_t s=20; 
    int *p = f(s); 
    for (size_t i=0; i<s; i++) 
     cout<<*(p+i)<<endl; 

    return 0; 
}