我已经制作了一些应用程序,我使用的方法就是:
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,我会使用带有静态类型的返回缓冲区。
感谢。当我读到类似的问题时,请写下你最喜欢的方法嘿嘿。
答案 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引用。