【问题标题】:Initializing a Char*[]初始化一个 Char*[]
【发布时间】:2011-01-15 10:54:47
【问题描述】:

问题在标题中,如何在 C++ 中初始化一个 char*[] 并为其赋值,谢谢。

【问题讨论】:

  • 你为什么不想使用 stl ?如 std::vector<:string> ?
  • ` ... = { "hello", "world" }` 没用?
  • 因为 std::vector<:string> 是浪费,而 char*[] 会做吗?
  • @Chris:浪费什么
  • 可能会浪费健壮性。或者浪费内存泄漏不足。

标签: c++ arrays cstring


【解决方案1】:

虽然您可能知道,char*[] 是一个指向字符的指针数组,我猜您想存储许多字符串。初始化这样的指针数组很简单:

char ** array = new char *[SIZE];

...或者如果您在堆栈上分配内存:

char * array[SIZE];

然后您可能希望使用循环填充数组,例如:

for(unsigned int i = 0; i < SIZE; i++){
    // str is likely to be an array of characters
    array[i] = str;
}

如该答案的 cmets 中所述,如果您使用新的(动态分配)分配数组,请记住删除您的数组:

delete[] array;

【讨论】:

  • char ** array = new char[SIZE]; 应该是char ** array = new char *[SIZE];
  • 您还可以提醒,如果数组是动态分配的,则应该使用delete [] array 删除它(使用delete array 是当前新手的错误)。
【解决方案2】:

根据您要初始化的内容,您可以执行以下任何操作:

char mystr[] = {'h','i',0};
char * myotherstring = "my other string";
char * mythirdstring = "goodbye";

char * myarr[] = {0};
char * myarr[] = {&mystr, myotherstring};
char * myarr[10];
char * myarr[10] = {0};
char * myarr[10] = {&mystr, myotherstring, mythirdstring, 0};

等等。等等

【讨论】:

  • 不会 &amp;mystr&amp;myotherstring 解析为 char[]* 类型,这不是数组初始化程序的预期 char*
  • 我稍微编辑了我的答案,现在它应该可以工作了。
  • 还有一个 char * 和 const char * 之间的区别问题,每当我尝试将 const char *(常量字符串)分配给 char * 时,我的编译器都会发出警告。
  • 是的...这实际上是为了演示初始化而不是编译器满意度:)
  • 修复 g++ 错误:char mystr[] = {'h','i',0}; const char * myotherstring = "my other string"; const char * mythirdstring = "goodbye"; char * myarr[] = {0}; const char * myarr1[] = {(char *)&amp;mystr, myotherstring}; char * myarr2[10]; char * myarr3[10] = {0}; const char * myarr4[10] = {(char *)&amp;mystr, myotherstring, mythirdstring, 0};
【解决方案3】:

我注意到你必须小心的一件事... C 和 C++ 在初始化语法上有些分歧。正如上面 Mark B. 指出的那样,您可以这样初始化一个 char 指针数组:

const char* messages[] =
{
    "Beginning",
    "Working",
    "Finishing",
    "Done"
};

但是在 C++ 中。正如 kriss 指出的那样,这会向您发出有关从字符串到 char* 的不推荐转换的警告。那是因为 C++ 假设您希望将字符串用于字符串;-}。

这并不总是正确的。所以当你真的想初始化一个 char* 数组时,我发现我必须这样做:

const char* messages[] =
{
    (char*)("Beginning"),
    (char*)("Working"),
    (char*)("Finishing"),
    (char*)("Done")
};

编译器现在很高兴...

【讨论】:

    【解决方案4】:

    像这样:

    char* my_c_string;
    char* x[] = { "hello", "world", 0, my_c_string };
    

    【讨论】:

    • 这是一个很好的例子。如果任何函数只将参数作为 void foo( char * x[] ) ,则 0 也有助于终止循环,您不需要另一个变量来查找数组的长度。
    【解决方案5】:

    如果你真的只想要一个 C 风格的常量字符串数组(例如索引消息):

    const char* messages[] =
    {
        "Beginning",
        "Working",
        "Finishing",
        "Done"
    };
    

    如果您尝试维护运行时变量字符串的容器,使用 C++ 工具 std::vector&lt;std::string&gt; 将使跟踪所有内存操作变得更加容易。

    std::vector<std::string> strings;
    std::string my_string("Hello, world.")
    strings.push_back("String1");
    strings.push_back(my_string);
    

    【讨论】:

      【解决方案6】:

      这样:

      char p1 = 'A';
      char p2 = 'B';
      char * t[] = {&p1, &p2};
      
      std::cout << "p1=" << *t[0] << ", p2=" << *t[1] << std::endl;
      

      但不知何故,我相信这不是真正问题的答案......

      如果你想在编译时定义一个 C 字符串数组,你应该使用一个 const char * 数组来代替:

      const char * t2[] = {"string1", "string2"};
      
      std::cout << "p1=" << t2[0] << ", p2=" << t2[1] << std::endl;
      

      没有 const 我的编译器会说: 警告:不推荐将字符串常量转换为“char*”

      【讨论】:

        【解决方案7】:

        就像任何其他数组一样:

        char *a, *b, *c;
        char* cs[] = {a, b, c}; // initialized
        cs[0] = b; // assignment
        

        【讨论】:

          【解决方案8】:
          #include <iostream>
          
          int main(int argc, char *argv[])
          {
              char **strings = new char *[2]; // create an array of two character pointers
              strings[0] = "hello"; // set the first pointer in the array to "hello"
              strings[1] = "world"; // set the second pointer in the array to "world"
          
              // loop through the array and print whatever it points to out with a space
              // after it
              for (int i = 0; i < 2; ++i) {
                  std::cout << strings[i] << " ";
              }
          
              std::cout << std::endl;
          
              return 0;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-01-04
            • 2018-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-12
            • 2014-05-10
            相关资源
            最近更新 更多