我有一个接收char **
作为参数的方法,以便解析和构造一个合适的内部对象。
void build (const char* values[], const int amount=3)
{
//..parse values and create instance of an inner field..
}
它是常量,因为我只想使用这些值,我根本不需要修改它们。这非常好。
现在我想能够编写一个方法,以一种我能够在先前声明的方法中使用此返回值的方式返回const char **
的方法。首先,我从我的类的实例获取所需的值,将它们转换为字符串并将它们放在一个数组中并返回它,但它抱怨我正在返回一个指向局部变量的指针。所以我想用另一个字段来保存这个指针,我创建了char ** values
。然后我意识到我需要为它指向的值分配内存,所以我用它去了。目前我描述的方法看起来像:
const char** getValues()
{
string var;
var = toString(point.zone);
values[0]= new char[var.length()+1]();
strcpy(values[0], var.c_str());
var = toString(point.easting);
values[1]= new char[var.length()+1]();
strcpy(values[1],var.c_str());
var = toString(point.northing);
values[2]= new char[var.length()+1]();
strcpy(values[2],var.c_str());
return values;
}
但目前这会引起抱怨,因为char ** values
不是常数。但是,如果我保持不变,strcpy
会抱怨相反的情况。如果我不回复它然后我不能在其他功能。我需要帮助解决这个问题。非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
一个要点是,为什么在char**
而不是在适当情况下使用std::string
或std::vector<std::vector<char>>
时,您的生活会变得复杂?
我的意思是,如果您正在使用C ++,因为您的标记似乎表明,那么为什么不使用C ++而不是C。
这将使您的生活更轻松。
另一件事:
const char**
是指向char的指针的指针。意思是你无法改变char
。如果您想更改使用char**
。
分配是关于您的代码的另一点,您如何为char**
分配内存?
如果您只是使用我上面所说的内容,那么这些增加了C ++中不需要的复杂性。
答案 1 :(得分:1)
您可能正在寻找const char* const* const
,其中不仅指向的数据,而且指针本身也是不变的。
从char**
到const char* const*
的隐式转换。然而,协方差规则禁止从char**
转换为const char**
,因为const char**
是可写的(您可以存储新指针),并且写入集合的操作不安全为了协方差。看看:
const char* a = "a literal"; // ok, literal is read-only, so const char* is good.
char* b;
char* c[] = { &b };
const char** d = c; // this step is illegal under the current rules
*d = &a;
*b = 'A'; // this would write to a string literal, causing an access violation
请注意,如果允许转换,您可以在不破坏类型安全的情况下写入const
对象,这根本不安全。
使用const char* const* d = c
,以下步骤(*d = &a
)已经非法,因此类型系统中没有漏洞。
答案 2 :(得分:1)
您遇到编译错误,因为您尝试直接strcpy到char const*
。
您应该strcpy到char *
并将此指针指回给值[]。
有关简单的解决方案,请参阅下面的修改代码:
const char** getValues()
{
string var;
char* p;
var = toString(point.zone);
p = new char[var.length()+1]();
strcpy(p, var.c_str());
value[0] = p; // now you can assign char* to char const* without compilation error
var = toString(point.easting);
p = new char[var.length()+1]();
strcpy(p, var.c_str());
value[1] = p;
var = toString(point.northing);
p = new char[var.length()+1]();
strcpy(p,var.c_str());
value[2] = p;
return values;
}