【问题标题】:Declaring char[][512]?声明 char[][512]?
【发布时间】:2009-10-16 23:48:02
【问题描述】:

我有一个需要 char[][512] 作为参数的 C++ SDK。我知道这应该是一个文件名列表,文件的数量可能会有所不同。对于我的一生,我无法弄清楚如何声明这一点。我有一个 CString 数组,我正在尝试使用 strcpy_s 将它们复制过来,然后将它们传递给 SDK。关于如何做到这一点的任何想法?

【问题讨论】:

    标签: c++ arrays multidimensional-array


    【解决方案1】:

    当用于声明函数的参数时,此声明具有特殊含义。在参数列表中,它等价于char[100][512]char[123][512]char[3][512](你明白了——第一个大小可以是任何东西,它被简单地忽略)和char (*)[512]。实际上,它将接受具有灵活(任意)第一大小的 2D 字符数组作为参数。

    您将实际传递给此函数的数组应使用具体的第一个大小声明,例如

    char names[3][512] = { "abc", "cde", "fgh" };
    

    当然,如果您在编译时知道第一个大小。

    如果第一个大小仅在运行时已知(例如,n),则必须动态分配数组

    char (*names)[512] = new char[n][512];
    // Now fill it with names
    

    或者,更优雅的是,使用 typedef

    typedef char TName[512];
    TName* names = new TName[n];
    // Now fill it with names
    

    我希望您所说的 SDK 功能也要求您将名称数组的第一个大小作为另一个参数传递。

    【讨论】:

      【解决方案2】:

      表示二维字符数组。行数可能会有所不同,应该/可以在另一个参数中指定。 C/C++ 编译器需要知道传递二维数组时的列数,因此他们可以构建映射函数。仅仅因为数组在作为参数传递时会衰减为指针,大小信息就会丢失。例如:

      void fun(char matrix[][512], int rows);
      ...
      char matrix[100][512];
      ...
      fun(matrix, 100);
      

      编译器为二维数组构造的映射函数类似于:

      // arrays in C/C++ are stored in Row-Major Order
      matrix[i][j] == matrix[i*numberOfColumns + j]
      

      如您所见,当传递一个 2D 数组并且丢失了大小信息时,我们需要列数来索引该数组中的任何元素。

      【讨论】:

        【解决方案3】:

        这是一种将 argv 样式的文件名数组转换为 SDK 所需格式的方法。

        typedef char  Char512[512];
        
        Char512 * convert(const char *names[], int n)
        {
            Char512 *  arr;
        
            arr = new char[n][512];
            for (int i = 0;  i < n;  n++)
                ::strncpy(arr[i], names[i], 512);
            return arr;
        }
        

        如有疑问,请使用 typedef。

        【讨论】:

        • 'strncpy' 不会像您认为的那样工作。如果输入数组包含 512 个字符(或更长)的名称,您将在输出数组中得到一个未终止的字符串。此外,由于您使用了 typedef(“如有疑问,请使用 typedef”),因此在“新”中使用它可能也是有意义的。
        • 是的,strncpy() 不会终止正好为 512 个字符的目标字符串。 OP(和他正在使用的 API)可能假设不会达到这个最大值。但那是一个完全需要处理的问题。
        【解决方案4】:

        提醒一下,如果你 new[] 某事,你必须在某个时候 delete[](而不是 delete)它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-13
          • 2016-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-12
          相关资源
          最近更新 更多