1

我有这个功能:

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);
}

我将这些条目的地址传递给函数,然后我想访问它们的成员“值”并打印它。

但是,当我尝试通过 va_arg 获取参数时,它返回的不是第一个参数,而是第二个参数,当另一个循环进入时,它是分段错误。

4

4 回答 4

2

正如 John Kugelman 在他的回答中所说,这里有一些将可变数量的参数传递给 printf/sprintf 的良好做法:-

 void Error(const char* format, ...)
 {
  va_list argptr;
  va_start(argptr, format);
  vfprintf(stderr, format, argptr);
  va_end(argptr);
 }
于 2012-11-25T17:46:01.293 回答
0

似乎有很多答案,但就我个人而言,我从来没有找到一种动态计算 va_list 中 args 数量的好方法。

也就是说,有几种方法可以解决它:

  • 使用 qrdl 指出的 NUMARGS(...) 宏
  • 像 main 一样将 args 的数量传递给函数void print(int numArgs, MyEntry *entry, ...)
  • 使用 NULL 终止列表

后者恰好是我个人的偏好,因为它往往与我的(而且看起来也像你的)直觉一致,即如何赶上列表的末尾。见下文:

 #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;
 }

快乐编码!

于 2012-11-26T00:08:54.923 回答
0

va_argNULL当您到达参数列表的末尾时不会返回。正如man va_arg所说:

会出现随机错误

因此,要解决它,您要么需要将多个参数传递给您的print函数,要么需要结束终止符。

要在编译时自动计算参数数量,可以使用宏

#define NUMARGS(...)  (sizeof((int[]){__VA_ARGS__})/sizeof(int))

在此答案中查看更多详细信息

于 2012-11-25T17:55:17.567 回答
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);
}
于 2012-11-25T18:00:59.547 回答