SegFault 同时使用 std::string::operator+= 和函数作为参数
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, ' '};
for (int k = 0; k < 2; k++)
if (h[k] > 9)
h[k] += 'A' - 10;
else
h[k] += '0';
return h;
}
但是对于这段代码,它应该像对传递的参数进行 url 编码的命令一样工作,字符串类的运算符 += 存在问题。我已经在调试器中遵循了它,并且函数十六进制工作正常(返回字符 c 的十六进制值(。
但是在这一行,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, ' '};
for (int k = 0; k < 2; k++)
if (h[k] > 9)
h[k] += 'A' - 10;
else
h[k] += '0';
return h;
}
此外,与其重新发明轮子,不如考虑使用std::hex
之类的东西来为您执行此操作,如此处所示。
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数