如何将std :: vector <char *>转换为char **?</char *>

时间:2013-01-04 21:11:38

标签: c++

我正在尝试将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() );
}

3 个答案:

答案 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
}