如何正确地从C/++函数返回值
How to return values from C/++ functions correctly?
我做了一些应用程序,我使用的方法是:
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引用传递。
相关文章:
- 程序不向函数返回值
- 如何将不可移动和不可复制的函数返回值获取到数组中
- 存储函数返回值或立即使用c++
- 如何删除新分配的字符,这也是函数返回值?
- 不从函数返回值会导致段错误
- lambda 函数返回值的有效性
- 如何获取有关 Visual Studio 代码分析中未经检查的函数返回值的警告
- 存储指向函数返回值的指针
- 在 OOP 中,调用函数返回值还是直接调用值更快?
- 函数返回值的自动类型扣除
- 为循环中多次调用的函数返回值预分配内存的正确方法是什么
- 函数返回值的位运算符提升
- 从捕获 constexpr 函数返回值的变量中删除 constexpr 会删除编译时计算
- C++ ReSharper - 生成函数返回值/参数类型的变量
- std::clamp - 检测函数返回值是否绑定到 const T&
- C 递归函数返回值
- 是否可以在C 中使回调函数返回值
- C++标准是否保证函数返回值具有常量地址?
- 将函数返回值传递给引用参数会导致 GCC 中的编译错误
- 函数返回值错误