生成一个const char **返回

时间:2012-09-28 15:42:49

标签: c++ pointers const

我有一个接收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会抱怨相反的情况。如果我不回复它然后我不能在其他功能。我需要帮助解决这个问题。非常感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:2)

一个要点是,为什么在char**而不是在适当情况下使用std::stringstd::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;

 }