忽略C函数中的参数

jsd*_*jsd 0 c

我正在将一个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)

Fre*_*Foo 5

我可以通过某种NULL与uLong params相同的方式吗?我收到一个关于转换为没有强制转换的指针的编译器警告.

不一般; 参数的允许值应列在您要嵌入的库的手册中(zlib,类似于它).不要传递NULL给期望a的函数long,这是无效的.

更糟糕的是:您正在传递未初始化变量 的值fileNameBufferSize,extraFieldBufferSizecommentBufferSize传递给函数.您的程序有未定义的行为.适当地设置这些变量,或者使用文字/表达式作为参数.

我做了malloc/ free正确吗?

你忘了检查返回值malloc.始终检查NULL.更好的是:因为你正在分配一定量的内存,所以只需在堆栈上执行:

char szFileName[1024];
Run Code Online (Sandbox Code Playgroud)

不需要mallocfree.(并且您可能希望使用PATH_MAX而不是任意1024.如果路径名可能比您平台上的路径名长,该怎么办?)

编辑:没关系这个PATH_MAX部分; 最大 这个字符串的长度应记录在zlib文档中,因为它不是最大值.系统中部件的长度,但最大值 长度zlib愿意存储.