2011-08-18 37 views
0

我已經取得了一些應用程序和使用方法的IM是這樣的:如何正確返回C/++函數的值?

INT name(char *one,char *two,char buffer[]){ 
memcpy(buffer,"omg",4);//or using std::string::copy ... that's how I actually return value 
...} 

,我把它想:

char returned[255];  
name(first,second,returned); 
printf/cout; 

一切都很好。現在我的問題是,這種方法可怕還是災難?此外,分配的內存255字符是怎麼回事,我的意思是有沒有辦法重新分配它以節省一些內存?我不得不返回多個值(從2到10)。如果我只需要1我會使用返回緩衝區靜態類型我猜。

謝謝。請寫下你最喜歡的方法,而我讀到類似的問題,這個嘿嘿。

+7

C和C++的答案是不同的,你需要哪一個? – KillianDS

+0

都:)因爲我必須返回字符數組這是C風格:) – lostinfsb

回答

0

那麼,在這種情況下,returned被分配在棧上,所以你肯定不能只是free它(我不知道你是否可以在C++中使用delete)。只需重新使用它。

也許在這種情況下,返回一個指向數組的指針會更好。

2

在C++中,你可能會返回一個std :: string並拋出一個異常而不是返回一個INT(?)。

+0

異常在失敗的情況下?嗯有一些例子? – lostinfsb

+0

http://www.cplusplus.com/doc/tutorial/exceptions/ – stefaanv

1

你的函數是一個災難,因爲你可以很容易地對它執行緩衝區溢出攻擊。

如果使用C++,你可以做到以下幾點:

void name(std::string one, std::string& two, std::string& buffer) { 
    buffer = "omg"; 
....} 

然後,你可以這樣調用它:

std::string one, two, buffer; 
name(one, two, buffer); 
+3

爲什麼不是一個參考,但兩個是一個?爲什麼一個和兩個不是const的引用? – RedX

+0

生成的字符串應該只是按值返回。 –

0

如果你在談論C++ - 這是非常糟糕的。使用std ::字符串,你可以做同樣的事情:

void name(const string &first, const string &second, string &returned) { 
    returned = first + second + "omg"; // Or something else 
} 

,把它:

string f = "one", s = "two", r; 
name(f, s, r); 
cout << r; // 'R' now contains "onetwoomg" 

雖然 '變異' 像這樣的事情也不是很C++。在C中它使用了很多,但在C++中,您通常分配給返回的值,而不是通過非const引用傳遞。

1

對於C,您應該將指針指向緩衝區的大小。將數組作爲參數傳遞會將其減少爲一個指針,該指針不包含有關它所指向的內存大小的任何信息。事情是這樣的:

int name(char *one, char *two, char *buffer, size_t len); 

,並調用它像這樣:

char returned[255]; 
int result = name("one", "two", returned, sizeof returned); 

對於C++,你應該使用的std :: string這需要照顧它都爲你,像其他人所說。

+0

實際上在C中傳遞一個數組作爲參數很好,如果它的類型是char arr [],sizeof(arr)/ sizeof(arr [0])會給你正確的大小,但是如果它是char *類型的話它只是一個指針。 –

+0

@Jesus:傳遞數組可以正常工作,但其大小的信息會丟失。在你的情況下'sizeof(arr)'將返回一個指針的大小,而不是數組佔用的所有元素的大小。 – harald

3

只需使用返回值即可。

std::string name(const std::string& one, const std::string& two) 
{ 
    return "omg"; 
} 

如果需要返回一個可變數目的值,返回一個矢量:

std::vector<std::string> name(const std::string& one, const std::string& two) 
{ 
    std::vector ret; 
    ret.push_back("omg1"); 
    ret.push_back("omg2"); 
    ret.push_back("omg3"); 
    return ret; 
} 

如果需要返回值的固定數目的,使用通過按引用喜歡你建議。

void name(const std::string& one, const std::string& two, std::string& ret1, std::string& ret2) 
{ 
    ret1 = "omg1"; 
    ret2 = "omg2"; 
} 
+0

你能解釋爲什麼要使用「const」良好的做法,我應該在哪裏使用它?很好回答btw。但像往常一樣,我問問前面的方式,函數是類型INT因爲我想知道它是否成功,並且我必須返回字符數組...所以string.c_str()可以在您的示例右側執行該技巧? – lostinfsb

+0

對於多個返回值,您也可以返回一個'tuple'。 – fredoverflow