我正在将一个C库集成到iOS的Objective-C应用程序中.我不是很精通C ...我知道这很危险.
C函数声明是这样的:
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
unz_file_info *pfile_info,
char *szFileName,
uLong fileNameBufferSize,
void *extraField,
uLong extraFieldBufferSize,
char *szComment,
uLong commentBufferSize));
Run Code Online (Sandbox Code Playgroud)
我真的只对此感兴趣szFileName.我知道我可以忽略void*并char*通过NULL.我可以通过一些 - NULL相当于uLongparams吗?我收到一个关于转换为没有强制转换的指针的编译器警告.
这是我调用此函数的循环,以防有人想对此进行评论.我做了malloc/ free正确吗?我不习惯低级C的东西.我知道有人抱怨Objective-C引用计数,但相比之下它非常豪华:)
unz_file_info pfile_info;
char *szFileName = malloc(1024);
uLong fileNameBufferSize;
uLong commentBufferSize;
uLong extraFieldBufferSize;
do {
int ret = unzGetCurrentFileInfo(zipFile, &pfile_info, szFileName, fileNameBufferSize, NULL, extraFieldBufferSize, NULL, commentBufferSize);
NSLog(@"get info ret %i filename size %lu, filename %s", ret, pfile_info.size_filename, szFileName);
// do other stuff here with the filename
}
while (unzGoToNextFile(zipFile) == UNZ_OK);
free(szFileName);
Run Code Online (Sandbox Code Playgroud)
我可以通过某种
NULL与uLong params相同的方式吗?我收到一个关于转换为没有强制转换的指针的编译器警告.
不一般; 参数的允许值应列在您要嵌入的库的手册中(zlib,类似于它).不要传递NULL给期望a的函数long,这是无效的.
更糟糕的是:您正在传递未初始化变量 的值fileNameBufferSize,extraFieldBufferSize并commentBufferSize传递给函数.您的程序有未定义的行为.适当地设置这些变量,或者使用文字/表达式作为参数.
我做了
malloc/free正确吗?
你忘了检查返回值malloc.始终检查NULL.更好的是:因为你正在分配一定量的内存,所以只需在堆栈上执行:
char szFileName[1024];
Run Code Online (Sandbox Code Playgroud)
不需要malloc或free.(并且您可能希望使用PATH_MAX而不是任意1024.如果路径名可能比您平台上的路径名长,该怎么办?)
编辑:没关系这个PATH_MAX部分; 最大 这个字符串的长度应记录在zlib文档中,因为它不是最大值.系统中部件的长度,但最大值 长度zlib愿意存储.