我正在尝试将c字符串的矢量转换为c字符串数组。我尝试了这个,但似乎没有成功:
int glfxGetProgramList(int effect, char** progList, int* count)
{
std::vector<char*> list;
gEffects[effect]->GetProgramList(list);
fprintf(stderr, "Lib Output: %s\n", list[0]);
progList = &list[0];
int size = list.size();
memcpy(count, &size, sizeof(int));
}
从stderr返回的调试输出在函数内是正确的。但是,当我在项目中使用此函数并尝试输出列表中的第一项时,它会因分段错误而崩溃。这是我项目中的代码:
char ** list;
int size;
glfxGetProgramList(effect, list, &size );
fprintf(stderr, "Output: %s\n", list[0]);
知道我做错了吗?
编辑:
我想我将不得不从问题的基础开始。有一个私有地图数组,我正在尝试从中获取名称列表。以下是GetProgramList的代码:
unsigned Effect::GetProgramList(vector<char*>& list) const
{
for(map<string,Program*>::const_iterator it=m_programs.begin(); it!=m_programs.end(); ++it)
list.push_back( (char*)it->first.c_str() );
}
答案 0 :(得分:3)
您可以像这样访问char**
(但仅当您的编译器支持C++11时):
progList = list.data();
答案 1 :(得分:2)
你为什么要施展?
第一个char *
元素的地址自动为char **
,无需投射。如果这不起作用,请发布progList
的定义。如果向量为空,则会导致未定义的行为,并可能导致应用程序崩溃。请确保list.size()
大于0(或!list.emty()
- 更好)。
答案 2 :(得分:1)
此:
progList = &list[0];
应该完美无缺。
但是因为:
std::vector<char*> list;
是函数的本地函数,它仅在函数处于活动状态时有效。一旦函数返回,指针就变为无效(因为向量不再存在)。
我提到这个的原因是你似乎试图在这里使用progList
作为输出参数:
int glfxGetProgramList(int effect, char** progList, int* count)
// Because you call like this:
glfxGetProgramList(effect, list, &size ); // The value of list will not change
// as you are passing by value.
fprintf(stderr, "Output: %s\n", list[0]); // So here list has not changed.
// But also note it would not have worked
// as the object you were trying to make it
// point at would have gone out of scope.
不幸的是(或者幸运的是)因为这些参数不是引用,所以您在本地进行的任何更改都不会影响函数外部的原始值。
所以你需要解决一些问题:
尝试:
int glfxGetProgramList(int effect, char**& progList, int* count)
// ^ pass by reference
{
static std::vector<char*> list; // Static makes the list last past the end of the function
list.clear(); // Now we have to clear it each time we call to make sure
// that old results do not pollute the list.
gEffects[effect]->GetProgramList(list);
fprintf(stderr, "Lib Output: %s\n", list[0]);
progList = &list[0]; // Value now passed correctly
// back to the calling function
// and list will still exist.
int size = list.size();
memcpy(count, &size, sizeof(int)); // This copies the first value out
}