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