【问题标题】:Assigning a value to a pointer to a const pointer to a const char (const char * const * p)为指向 const 的指针赋值 指向 const char 的指针 (const char * const * p)
【发布时间】:2018-06-11 08:49:21
【问题描述】:

我是 C++ 新手,正在努力使以下代码正常工作:

struct Keywords
{
     const char* const* keys;
     int count;
}

Keywords GetKeywords()
{
     Keywords keywords;
     keywords.count = 10;
     string keys = "a b c d e";
     keywords.keys = keys???;
     return keywords;
}

int main(int argc, char *argv[])
{
     Keywords keywords = GetKeywords();
     cout<<keywords.count<<endl; //prints 10
     cout<<keywords.keys<<endl;  //prints a memory address like 0030F838
}

如何使keys 指向a b c d e? 到目前为止,我已经尝试过这个

char * writable = new char[keys.size() + 1];
strcpy(writable, keys.c_str());
writable[keys.size()] = '\0';

const char* a = writable;
const char** ptr = &a;
results.keys = ptr;

在调试时我可以看到results.keys 显示a b c d e,但一旦返回GetKeywords()results.keys 就会指向不可读的内存位置。

我无法对 struct KeywordsGetKeywords() 方法签名进行任何更改。

【问题讨论】:

  • 您的尝试是错误的,因为您在 GetKeywords 函数中存储了指向局部变量的指针。一旦函数返回函数内部所有局部变量的生命周期结束,它们就会超出范围。
  • 为什么不使用std::vector&lt;std::string&gt;
  • 你想要一个指针指向指针的原因是什么?你想要一个字符串“数组”,其中第一个元素是字符串"a",第二个元素是"b" 等等?您遇到的真正问题是什么?
  • @Someprogrammerdude 是的,我本可以使用更简单的方法来返回值,但这是一项任务,我无法完成最后一部分。结果应作为关键字 GetKeywords() 返回。没有其他选择。
  • @ulughbekula :就像 Miles Budnek 所问的那样,为什么不在这里使用 std::vector&lt;std::string&gt; 呢?您是否被禁止更改作业中的struct Keywords

标签: c++ pointers constants


【解决方案1】:

考虑到Some programmer dudeMiles Budnek 和其他人给出的提示,我能够解决问题,如下所述:

在我最初的问题中,密钥由string keys = "a b c d e"; 表示。 但在我正在处理的任务中,a b c d e 是通过迭代 set&lt;string&gt; 项目构建的。下面是它的完成方式:

struct Keywords
{
    const char* const* keys;
    int count;
}

Keywords GetKeywords()
{
    Keywords keywords;
    keywords.count = 5;

    set<string> keys;
    GetKeys(keys);//returns keys = {"a", "b", "c", "d", "e"}

    char** charKeysPtr = new char *[keys.size() + 1];
    set<string>::iterator it;
    int index = 0;

    //Iterate the set and copy each key
    for (it = keys.begin(); it != keys.end(); it++)
    {
        charKeysPtr[index] = new char[it->size() + 1];
        strcpy(charKeysPtr[index], it->c_str());
        charKeysPtr[index][it->size()] = '\0';
        index++;
    }

    keywords.Keys = charKeysPtr;

    return keywords;
}

int main(int argc, char *argv[])
{
     Keywords keywords = GetKeywords();

     //Print keys
     for (int i = 0; i < keywords.count; ++i)
        cout << keywords.keys[i] << " ";

     //Output is "a b c d e"

     //Memory cleanup and etc.
}

谢谢你们!

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2016-06-23
    • 2012-08-04
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多