gpt4 book ai didi

c - OS X 上的 vsprintf : EXC_BAD_ACCESS

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

我发现 vsprintf 在 OSX 上的奇怪行为。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#if defined(WIN32)
#include <windows.h>
#define VSNPRINTF _vsnprintf
#elif defined(LINUX) || defined (DARWIN)
#define VSNPRINTF vsnprintf
#include <sys/types.h>
#include <unistd.h>
#endif

char *f(const char *fmt, ...)
{
char *out = NULL;
const int step = 32;
int n = -1, lout = step;
va_list arg;

if(fmt!=NULL)
{
va_start(arg, fmt);
do
{
if(!out)
{
free(out);
out = NULL;
}
out = (char*)malloc(lout + 1);
if(!out) break;
memset(out, 0, lout + 1);

n = VSNPRINTF(out, lout, fmt, arg);
if(n == -1 || n + 1 > lout)
{
lout += step;
n = -1;
}
}while(n == -1);
va_end(arg);
}

return out;
}

int main()
{
char *msg = NULL;
unsigned long x = 0xDEADBEEF;

msg = f("%X%X%X%X", x, x, x, x);
if(!msg) return -1;

puts(msg);

return 0;
}

该函数应返回包含格式化文本的分配字符串 (char*)。它可以在 Linux 和 Windows 上正常工作。它在 OSX 上返回格式错误的文本,有时会导致段错误 (EXC_BAD_ACCESS)。顺便说一句,我知道我可以使用 vasprintf。

可能是什么问题?

最佳答案

您的问题很可能是您多次使用相同的 va_list 调用 vsnprintf。这在某些 ABI 中不起作用。

查看 va_copy 的手册页。简短的版本是做这样的事情:

      va_list c;
va_copy(c, arg);

n = VSNPRINTF(out, lout, fmt, c);
va_end(c);

关于c - OS X 上的 vsprintf : EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13508528/

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