如何正确地从C/++函数返回值

How to return values from C/++ functions correctly?

本文关键字:函数 返回值 正确地      更新时间:2023-10-16

我做了一些应用程序,我使用的方法是:

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,我会使用返回缓冲区静态类型我猜。

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

直接使用返回值。

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";
}

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

你的函数是一个灾难,因为可以很容易地对它执行缓冲区溢出攻击。

如果你使用c++,你可以这样做:

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

那么你可以这样命名它:

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

对于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,就像其他人说的那样,它会为你处理好这一切。

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

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

如果你说的是c++,那就太糟糕了。使用std::string,您可以做同样的事情:

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