gpt4 book ai didi

c - 忽略 C 函数中的参数

转载 作者:太空宇宙 更新时间:2023-11-04 05:30:47 24 4
gpt4 key购买 nike

我正在将 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 参数吗?我收到有关在不进行强制转换的情况下转换为指针的编译器警告。

这是我调用此函数的循环,以防有人想对此发表评论。我是否正确执行了 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);

最佳答案

Can I pass some sort of NULL-equivalent to the uLong params? I'm getting a compiler warning about converting to pointer without a cast.

一般不会;参数的允许值应列在您要嵌入的库(zlib,类似的库)的手册中。不要将 NULL 传递给需要 long 的函数,这是无效的。

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

Did I do the malloc/free correctly?

您忘记检查 malloc 的返回值。始终检查 NULL。更好的是:因为你分配的内存量是固定的,所以只需在堆栈上这样做:

char szFileName[1024];

不需要 mallocfree(您可能想使用 PATH_MAX 而不是任意的 1024。如果路径名可能比您平台上的路径长怎么办?)

编辑:不用管PATH_MAX部分;最大值这个字符串的长度应该记录在 zlib 文档中,因为它不是最大值。系统上某个部分的长度,但最大值。 zlib 愿意存储的长度。

关于c - 忽略 C 函数中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6497902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com