如何为const char双指针动态分配内存(使用new)

时间:2019-07-02 17:30:24

标签: c++

我创建了一个指向指向char数组(double ptr)的指针的数组的指针:

//The autogenerated property in the model:

[AutoGenerateProperty]
[Display("User")]
[PropertyOrder(1)]
[DisplayMemberPathCollection("Name")]
[SelectedItemCollection("SelectedUser")]

//I changed it to this:
[AutoGenerateProperty]
[Display("User")]
[PropertyOrder(1)]
[DisplayMemberPathCollection("Name","Age")]
[SelectedItemCollection("SelectedUser")]

//The attribute modification I made to get two parameters:

public DisplayMemberPathCollectionAttribute(string first = "", string second = "")
{
 DisplayMemberPath = first + second;
}

然后我尝试为每个指向字符串的单独指针动态分配内存:

const char **strptr = new const char*[str_arr.size()]; //str_arr.size() = number of strings

然后我在函数等中使用双指针。

for (int i=0; i < str_arr.size(); i++) {
  size_t len = str_arr[i].length(); //length of each string
  strptr[i] = new char[len+1]; //+1 for null character
  strcpy(strptr[i], vars[i]->name().c_str()); // errors here
}

然后释放内存:

somefxn(strptr); ...

似乎我已经涵盖了必要的基础。但是,我在strcpy行上得到了这些错误:

for (int i=0; i< str_arr.size(); i++) { delete [] strptr[i]; }
delete [] strptr;

似乎是一个简单的类型问题,所以我更改了这一行:

"error: invalid conversion from 'const char*' to 'char*' ",
"error: initializing argument 1 of 'char* strcpy(char*, const char*)' "

相同的错误,并且在strptr [i]行上有一个新错误:

strptr[i] = new const char[len+1];

不知道该怎么做。我认为我忽略了指针和内存分配的细节,但还没有弄清楚。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

strcpy(strptr[i], vars[i]->name().c_str()); // errors here

自从您宣布strptr

const char **strptr = ...

编译器不允许您更改strptr[i]指向的任何内容。删除const

char **strptr = ...

除非出于不可控的原因需要使用char** strptr,否则应切换为使用std::stringstd::vector

std::vector<std::string> str_array;

这将避免编写大量容易出错的代码的需求。

答案 1 :(得分:0)

const char **strptr = new const char*[5];

是指向 const 字符的非常数指针的非常数指针。

您可以通过执行以下操作来修改双指针: strptr++;strptr=nullptr;

您可以修改各个指针,例如strptr[i]= new const char[2]{'a', 'b'};strptr[i]++;

但是您不能修改 const 字符值,即strptr[i][j]='b';不起作用。 std::strcpy试图做到这一点,编译器当然会抱怨。

答案 2 :(得分:-1)

首先,避免使用拥有裸露的指针。通常几乎不需要它们。您似乎正在分配数组。为数组分配内存的最简单解决方案是std::vector,或者专门为字符串std::string

存储数组数组的最有效方法是包含所有元素的平面数组。在这种情况下,适当的解决方案是使用单个std::string。如果您有一个使用const char **作为参数的函数,则可以使用const char*指针数组来指向该字符串容器中的偏移量。