声明char [] [512]?

时间:2009-10-16 23:48:02

标签: c++ arrays multidimensional-array

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

4 个答案:

答案 0 :(得分:4)

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

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

char (*)[512]

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

如果第一个大小仅在运行时已知(例如,char names[3][512] = { "abc", "cde", "fgh" }; ),则必须动态分配数组

n

或更优雅地使用typedef

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

我希望您所讨论的SDK函数还要求您将名称数组的第一个大小作为另一个参数传递。

答案 1 :(得分:2)

它表示二维char数组。行数可以变化,它应该/可以在另一个参数中指定。 C / C ++编译器需要知道传递2D数组时的数字列,因此他们可以构建映射函数。只是因为当数组作为参数传递时,数组会衰减为指针,因此大小信息会丢失。例如:

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

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

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

正如您所看到的,当传递2D数组并且大小信息丢失时,我们需要列数来索引此数组中的任何元素。

答案 2 :(得分:1)

以下是将 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。

答案 3 :(得分:1)

提醒您,如果您new[]某事,则必须delete[](而不是delete)。