我创建了一个指向指向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];
不知道该怎么做。我认为我忽略了指针和内存分配的细节,但还没有弄清楚。有什么想法吗?
答案 0 :(得分:5)
strcpy(strptr[i], vars[i]->name().c_str()); // errors here
自从您宣布strptr
为
const char **strptr = ...
编译器不允许您更改strptr[i]
指向的任何内容。删除const
。
char **strptr = ...
除非出于不可控的原因需要使用char** strptr
,否则应切换为使用std::string
和std::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*
指针数组来指向该字符串容器中的偏移量。