我有这个功能:
void print(THashEntry *entry, ...)
{
va_list parameters;
va_start(parameters, entry);
while (true)
{
THashEntry *currentEntry = va_arg(parameters, THashEntry *);
if (!currentEntry)
{
break;
}
printf("%s\n", currentEntry->value);
}
va_end(parameters);
}
我将这些条目的地址传递给函数,然后我想访问其成员“value”并打印它。
然而,当我尝试通过va_arg获取参数时,它返回的不是第一个,而是第二个参数,从开始就开始,当另一个循环循环进入时,它就是分段错误。
答案 0 :(得分:2)
正如John Kugelman在his answer中所述,这里有一些将可变数量的参数传递给printf / sprintf的好方法: -
void Error(const char* format, ...)
{
va_list argptr;
va_start(argptr, format);
vfprintf(stderr, format, argptr);
va_end(argptr);
}
答案 1 :(得分:0)
va_arg
将不会返回NULL
。正如man va_arg
所说:
将发生随机错误
因此,为了解决这个问题,您需要将多个参数传递给print
函数或结束终止符。
要在编译时自动计算参数数量,可以使用宏
#define NUMARGS(...) (sizeof((int[]){__VA_ARGS__})/sizeof(int))
中查看更多详情
答案 2 :(得分:0)
我为你的设计辩护而道歉,但这可能是使用
的替代方案 struct abc {
int a;
char b[10];
};
void f(int size, abc* a) {
for (int i = 0; i < size; i++) {
abc x = a[i];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
abc *arrAbc = new abc[10];
for (int i = 0; i < 10; i++) {
arrAbc[i].a = 0;
}
f(10, arrAbc);
}
答案 3 :(得分:0)
似乎有很多答案,但我个人从来没有找到一个很好的方法来动态计算va_list中args的数量。
那说,有几种方法可以解决它:
void print(int numArgs, MyEntry *entry, ...)
后者恰好是我个人的偏好,因为它往往与我的(并且看起来也是你的)本能地如何抓住列表的末尾。见下文:
#import <stdarg.h>
typedef struct MyEntry {
int a;
int b;
} MyEntry;
void print(int numArgs, MyEntry *entry, ...) {
va_list parameters;
va_start(parameters, entry);
MyEntry *m;
for ( m = entry; m != NULL; m = va_arg(parameters, MyEntry *)) {
printf("%d\n", (int)m->a);
}
va_end(parameters);
}
int main(int argc, char *argv[]) {
MyEntry entry = { 10, 20 };
MyEntry entry2 = { 30, 40 };
MyEntry entry3 = { 50, 60 };
MyEntry entry4 = { 70, 80 };
MyEntry entry5 = { 90, 100 };
print(2, &entry, &entry2, &entry3, &entry4, &entry5, NULL);
return 1;
}
快乐的编码!