0

我有一个函数f,定义如下:

struct s {
    void *data;
    struct s *next;
};

void
f(struct s **p, void *q)
{
    /* ... */
}

void *
g(struct s **p)
{
    /* ... */
}

我必须使用很多不同的参数来测试这些函数。但是指向的指针void只能包含一个对象地址,对吗?那么如何在不使用临时变量(或者可能在宏中)的情况下自动执行以下操作。

f(p, 2);
f(p, 'c');
f(p, 3.14);
4

3 回答 3

2

临时变量是没有办法的(嗯,你可以使用一个静态变量,它肯定不是临时的!)因为你需要一个地址,因此你需要一个(非注册)变量。

但是,这并不意味着您需要额外的代码行:您可以使用类型化初始化程序(从 C99 开始):

f(p, &(int){2});
f(p, &(double){3.14});

但是,该函数(正如您定义的那样)无法知道您刚刚传递给它的对象有多大,并且它不能只存储指针值,因为它是一个指向非常临时变量的指针。

(整数可以转换为指针并再次返回,但有一些限制,但您必须检查您的实现以获取详细信息。)

于 2012-09-02T15:05:11.483 回答
1

您可以查看此线程示例,它以类似的方式接受参数:

_beginthread( Bounce, 0, (void *) (structure_of_whatever_variables)  );
                            ^
                            |
                            |
                       This is the parameter of function Bounce

这是上述示例的来源。

于 2012-09-02T15:05:53.497 回答
1

创建一个测试变量数组并创建一个 for 循环以逐个调用它。这样你就可以直接发送地址,也许这样的东西应该可以工作:

for (int i = 0; i < NumOfTestCases; i++)
{
    f(p, &pArrOfTestCases[i]);
}

我希望这会有所帮助。

于 2012-09-02T15:10:05.943 回答