如何正确返回C / ++函数的值?

时间:2011-08-18 09:14:25

标签: c++ c return

我已经制作了一些应用程序,我使用的方法就是:

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个字符分配的内存是怎么回事,我的意思是有没有办法重新分配它以某种方式节省内存?

这就是所谓的pass-by-reference,在任何一种情况下我都要返回多个值(从2到10)。如果我只需要1,我会使用带有静态类型的返回缓冲区

感谢。当我读到类似的问题时,请写下你最喜欢的方法嘿嘿。

6 个答案:

答案 0 :(得分: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;
}

如果您需要返回固定数量的值,请按照建议使用pass-by-reference。

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

答案 1 :(得分:2)

在C ++中,您可能会返回一个std :: string并抛出异常而不是返回INT(?)。

答案 2 :(得分: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 :(得分: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来处理这一切,就像其他人所说的那样。

答案 4 :(得分:0)

好吧,在这种情况下,returned被分配在堆栈上,所以你肯定不能只free它(我不知道你是否可以在{+ C ++中delete) 。只需重复使用它。

也许在这种情况下,返回指向数组的指针会更好。

答案 5 :(得分:0)

如果你在谈论C ++ - 这很糟糕。使用std :: strings,你可以做同样的事情:

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引用。