我有一个C++ SDK,需要一个char [] [512]作为参数。我知道这应该是一个文件名列表和文件数量可能会有所不同。对于我的生活,我无法弄清楚如何声明这一点。我有一个CString的数组,我试图使用strcpy_s复制它们,然后将它们传递给SDK。任何想法如何做到这一点?声明char [] [512]?
1
A
回答
4
该声明在用于声明函数参数时有特殊含义。在参数列表中,它相当于char[100][512]
,char[123][512]
,char[3][512]
(您会明白 - 第一个大小可以是任何东西,它会被忽略),也可以是char (*)[512]
。实际上,它将接受一个灵活(任意)第一大小的二维字符数组作为参数。
,你会真正传递给这个函数的数组应该用具体的第一大小声明,例如
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);
映射函数,该编译器构建的2D阵列是类似于:
// arrays in C/C++ are stored in Row-Major Order
matrix[i][j] == matrix[i*numberOfColumns + j]
正如你可以看到,当2D阵列被传递和大小的信息丢失,我们只需要列数来索引此数组中的任何元素。
1
以下是将文件名称风格的转换为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。
1
只是提醒一下,如果你new[]
的东西,你必须delete[]
(而不是delete
)它有时。
相关问题
- 1. 类型声明错误:[Char]和[[Char]]
- 2. (char **)(&samples)声明了什么?
- 3. Char * string []声明错误
- 4. C-声明char数组
- 5. C函数声明'void msgBox(const char *,const char *)'与前面的声明冲突
- 6. 如何声明已在类中声明的char变量的char数组?
- 7. “bad expression”声明char数组c
- 8. 区分字符串声明与char声明
- 9. 声明char数组中的Ruby FFI
- 10. 什么是arduino中的char *声明?
- 11. 在声明时初始化char数组?
- 12. 如何解释声明char * x [5]?
- 13. C++ - '(const char *)'未在范围内声明?
- 14. 将shellcode声明为char []数组和char *之间的区别
- 15. 当在struct中声明时,char []和char *有什么区别?
- 16. 输入一个char *声明之前崩溃的程序,而这样做到'只是声明'char *不。为什么?
- 17. 这是可能的声明可以存储超过512个字符
- 18. 在传递char * argv []和声明char * argv之间有什么不同?
- 19. var声明期望声明
- 20. handlebars.js - 声明是否声明
- 21. 在C++中声明char十六进制常量11
- 22. 如何在声明后设置一个const char *?
- 23. 如何在Visual Basic .NET中声明Char文字?
- 24. 是否必须在声明char const * ptr =“some characters”时使用'const'?
- 25. 将size_t转换为int来声明char数组的大小
- 26. 声明从壳全局CHAR阵列用C
- 27. 如何在C中声明大的2D char数组?
- 28. 使用一个char **的项目(后声明后初始化)
- 29. 有条件地在二维char数组中声明数组?
- 30. 如何正确声明和初始化Char数组?
'strncpy'将无法正常工作,因为您认为它可以在此工作。如果输入数组包含512个字符(或更长)的名称,则最终将在输出数组中包含一个未终止的字符串。另外,既然你做了typedef(“如果有疑问,请使用typedef”),在'new'中使用它也许是有意义的。 – AnT 2009-10-17 01:27:12
是的,'strncpy()'不会终止正好512个字符的目标字符串。 OP(以及他使用的API)可能假设不会达到这个最大值。但那是一个棘手的问题需要处理。 – 2009-10-26 22:06:49