我正在將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_截斷字符串。 –