0

我有一个接收 achar **作为参数的方法,以便解析和构造一个正确的内部对象。

  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就会抱怨相反。如果我不返回它常量,那么我不能在其他函数中使用它。我需要帮助解决这个问题。非常感谢任何帮助,谢谢。

4

3 回答 3

2

一个要点,你为什么要让你的生活变得复杂char**而不是使用std::stringstd::vector<std::vector<char>>在适当的地方?

我的意思是,如果您使用 C++ 作为标签似乎表明的那样,那么为什么不使用 C++ 而不是 C。

这将使您的生活更轻松。

另一件事:

Aconst char**是指向 char 的指针,它是 const。这意味着您无法更改char. 如果你想改变使用char**.

分配是关于您的代码的另一点,您如何为您的代码分配内存char**

如果您只是使用我上面所说的,这些是您在 C++ 中不需要的额外复杂性。

于 2012-09-28T15:47:56.500 回答
1

你得到一个编译错误,因为你试图char const*直接 strcpy 到 a。您应该改为将 strcpy 分配给 achar *并将此指针分配回 values[]。

请参阅下面的修改代码以获得简单的解决方案:

 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;

 }
于 2012-09-28T15:57:30.670 回答
1

您可能正在寻找const char* const* const,其中不仅指向的数据,而且指针本身都是恒定的。

char**从到有一个隐式转换const char* const*。然而,协变规则禁止从char**to转换const char**,因为 aconst 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) 已经是非法的,所以类型系统中没有漏洞。

于 2012-09-28T15:51:59.777 回答