返回常量char指针会产生错误

时间:2012-12-19 14:50:20

标签: c++ function pointers return constants

我是C ++的新手,还没有完全掌握所有的概念,所以我很困惑为什么这个功能不起作用。我目前不在家,所以我还不能发布编译器错误,我会在回家后立即执行此操作。

这是功能。

const char * ConvertToChar(std::string input1, std::string input2) {
    // Create a string that you want converted
    std::stringstream ss;
    // Streams the two strings together
    ss << input1 << input2;
    // outputs it into a string
    std::string msg = ss.str();
    //Creating the character the string will go in; be sure it is large enough so you don't overflow the array
    cont char * cstr[80];
    //Copies the string into the char array. Thus allowing it to be used elsewhere.
    strcpy(cstr, msg.c_str());

    return * cstr;
}

将两个字符串连接在一起并返回一个const char *。那是因为我想要使用它的函数需要传递一个const char指针。

2 个答案:

答案 0 :(得分:3)

代码返回指向本地(堆栈)变量的指针。当调用者获得此指针时,该局部变量不再存在。这通常被称为悬挂参考。

如果您想将std::string转换为c风格的字符串,请使用std::string::c_str()

因此,要连接两个字符串并获取一个c风格的字符串,请执行以下操作:

std::string input1 = ...;
std::string input2 = ...;

// concatenate
std::string s = input1 + input2;

// get a c-style string
char const* cstr = s.c_str(); 
// cstr becomes invalid when s is changed or destroyed

答案 1 :(得分:1)

不知道错误是什么,很难说,但是这个 行:

const char* cstr[80];

似乎错了:它创建了一个包含80个指针的数组;当它 隐式转换为指针,类型将为char const**,当它作为传递时应该给出错误 strcpy的参数,以及返回中的取消引用 语句与写cstr[0]的语句相同,并返回 数组中的第一个指针 - 自数组的内容 从未被初始化,这是未定义的行为。

在继续之前,您必须定义功能 应该返回 - 不仅是它的类型,而是指向的位置 记忆将驻留。有三种可能的解决方案:

对缓冲区使用本地静态:
这个解决方案是 经常在C早期使用,并且仍然存在于许多 C库中的函数。它有两个主要缺陷:1) 连续调用会覆盖结果,所以客户端代码 必须在再次调用函数之前制作自己的副本,并且2) 它不是线程安全的。 (第二个问题可以通过使用来避免 线程本地存储。)在像你这样的情况下,它也有 问题,缓冲区必须足够大的数据,这 可能需要动态分配,这增加了 复杂。
返回指向动态分配内存的指针:
这在理论上很有效,但需要客户端代码免费 记忆。这必须严格记录,并且是 非常容易出错。
要求客户端代码提供缓冲区:
这可能是现代代码中的最佳解决方案,但确实如此 意味着您需要额外的地址参数和 缓冲区的长度。

除此之外:没有必要使用std::ostringstream 如果你所做的只是连接;只需添加两个字符串。 无论您使用何种解决方案,请验证结果是否合适。