繁体   English   中英

使用 std::string::operator+= 和函数作为参数时出现 SegFault

[英]SegFault while using std::string::operator+= with function as param

我知道当内存分配不足/指针错误指示出现问题时,会发生分段错误。

#include <iostream>
using namespace std;

const char *hex(char);

int main(int argc, char **argv)
{
    string url = "start http://www.cplusplus.com/search.do?q=";
    char a[2];

    for (int i = 0; i < argc; i++)
    {
        if (i != 1)
            url += '+';
        for (int j = 0; argv[i][j]; j++)
        {
            if (i == 1 && j == 0 && argv[i][j] == '.')
                continue;
            url += '%';

            // a[0] = argv[i][j] / 16;
            // a[1] = argv[i][j] % 16;
            // for (int k = 0; k < 2; k++)
            // {
            //  if (a[k] > 9)
            //      a[k] += 'A' - 10;
            //  else
            //      a[k] += '0';
            //  url += a[k];
            // }

            url += hex(argv[i][j]);
        }
    }
    system(url.c_str());
    return 0;
}

const char *hex(char c)
{
    char h = {c / 16, c % 16, '\0'};
    for (int k = 0; k < 2; k++)
        if (h[k] > 9)
            h[k] += 'A' - 10;
        else
            h[k] += '0';
    return h;
}

但是对于这段代码,它应该像对传递的参数进行 url 编码的命令一样工作,字符串类的运算符 += 存在问题。 我在调试器中遵循了它,并且函数 hex 正常工作(返回 char c 的 hexValue)。

但在这一行, url += hex(argv[i][j]); 由于某种原因,有一个 segFault,argv[i][j] 是 char,hex() 以 const cstring (const char *) 的形式返回其十六进制值。 我什至在最后添加了一个空字符,如果它有什么不同的话......

我什至检查了 std::string 引用以确保操作符接受 const char* (但这很明显,否则会出现 Compile-t 错误,而我没有)。

有什么猜测吗? 顺便说一句,注释代码替代了函数式代码并且可以完美运行,当然,在 Windows 上。

非常感谢任何建议,因为如果此功能有效,它将使这一点更加便携,我知道可能有用于 url 编码的库函数,但这只是练习。

您的hex函数正在向临时局部变量返回一个地址,这是一个巨大的问题,因此当该内存被重新使用时它会在那里崩溃。

当该函数返回h立即超出范围,因此任何指向h指针都无效。

由于您使用的是 C++,因此只需使用std::string

std::string hex(const char c)
{
    std::string h = {c / 16, c % 16, '\0'};

    for (int k = 0; k < 2; k++)
        if (h[k] > 9)
            h[k] += 'A' - 10;
        else
            h[k] += '0';

    return h;
}

此外,与其重新发明轮子, 不如考虑使用std::hex类的东西来为您执行此操作, 如此处所示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM