【问题标题】:How to return a char* from a function in C++ [duplicate]如何从 C++ 中的函数返回 char* [重复]
【发布时间】:2013-12-26 06:24:03
【问题描述】:

我在c++中有以下函数

    char* Test::convertToSHA(const char* cc) {

    const char* salt ="sh$^$#@!&7hbfvatfacv@@@@bagg=shjgvshvcbschj";
    time_t currentTime;
    time(&currentTime);
    CCString startTimeString;
    startTimeString.createWithFormat("%d", currentTime);

    std::string s = cc;
    s += startTimeString.getCString();
    s += salt;

    char *str = new char[strlen(s.c_str()) +  1];
    int length=strlen(str);
    unsigned char hash[length*2];
    char hexstring[41];
    sha1::calc(str,length,hash);
    sha1::toHexString(hash, hexstring);

    return hexstring;
}

在通话中我使用

char* output=NULL;
output= Test::convertToSHA("hello");

这导致我的代码崩溃。我返回字符串有问题吗?我怎样才能从这个函数返回?

【问题讨论】:

  • 这应该只返回一个std::string。
  • 不返回堆栈变量。要么new hexstring,要么让调用者分配内存并传递给convertToSHA。但更好的方法是返回 std::string (或通过引用返回),因为您使用的是 c++。
  • 你能告诉我怎么做吗?
  • 调用者不知道要分配多少内存?
  • 您为什么要创建(并忘记填充)临时缓冲区str?你可以写sha1::calc(s.data(), s.length(), hash);。

标签: c++ pointers


【解决方案1】:

You can never return a local pointer in C or C++. 而是将指针作为参数传递:

void Test::convertToSHA(const char* cc, const char* hexstring) {

   //no change to body
   //no return statement needed
}

//then when calling the function:

char hexstring[41];

convertToSHA(cc, hexstring);

//hexstring has been modified

或者只使用std::string。如果您需要转换为 c 风格的字符串,请使用 c_str()(但您仍然无法返回指针)。

【讨论】:

  • 我已经修改了代码。它仍然崩溃。
  • @BadLuckBrian 向我们展示新代码。
【解决方案2】:

我假设你正在使用这个library。我觉得奇怪的是它声称是用C++ 编写的,但没有利用C++ 成语。该函数修改指针,并且不返回任何内容,因此您确实需要一个局部变量。幸运的是,std::strings 很乐意接受 char [] 参数。

std::string Test::convertToSHA(const char* cc) {
    // ...
    char hexstring[41];
    sha1::calc(str,length,hash);
    sha1::toHexString(hash, hexstring);
    std::string ret(hexstring);

    return ret;
}

【讨论】:

  • 好的,谢谢。我确实使用那个图书馆。它现在工作。感谢您的帮助。
猜你喜欢
  • 2020-02-21
  • 2018-05-09
  • 2018-10-18
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 2018-10-02
相关资源
最近更新 更多