我正在将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));
我真的只在szFileName
感兴趣。我知道我可以通过NULL
忽略void*
和char*
。我可以通过某种NULL
- 等效于uLong
params吗?我收到了一个编译器警告,关于转换为没有强制转换的指针。
这是我的循环调用这个函数,以防有人想对此发表评论。我是否正确地做了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);
哦,优良的...我误解了什么fileNameBufferLength东西是,我还以为是要与文件名的长度填写,我不知道我说的是功能有多大的我分配的缓冲区! (这似乎怪我,因为如果我分配一个太小的缓冲?我猜的功能它只是截断结果,但是这似乎是一个愚蠢的事。) – jsd
截断结果可能看起来像一个愚蠢的事情这样做,但功能没有选择。如果它想写100个字节,但你给它一个只有80个字节的缓冲区,它不能再写入额外的20个字节,否则它会覆盖内存,并带来潜在的灾难性后果。没有什么可以做_except_截断字符串。 –