在C中对一个元素的数组执行struct的typedef可能产生的副作用

Abi*_*her 6 c typedef gmp ruby-c-extension

我遇到了这段代码.

typedef __mpz_struct MP_INT;
typedef __mpz_struct mpz_t[1];
Run Code Online (Sandbox Code Playgroud)

这里的struct __mpz_struct是一个结构,它被定义为单个元素的数组.我理解这是一个通过C中的引用传递的技巧.然后mpz_t被用作声明变量的类型并将它们作为参数传递.此外,还有一个评论

/*
  MP_INT*, MP_RAT* and MP_FLOAT* are used because they don't have side-effects
  of single-element arrays mp*_t
*/
Run Code Online (Sandbox Code Playgroud)

他们在谈论什么样的副作用?

alk*_*alk 2

将数组传递给函数让数组衰减为指向其第一个元素的指针。

通过将 Address-Of 运算符应用于&与数组元素类型相同的简单变量,可以达到相同的效果。

例子:

struct S
{
   int i;
   float f;
};
Run Code Online (Sandbox Code Playgroud)

void set_S(struct S * ps)
{
  ps->i = 40;
  ps->f = 2.;
}
Run Code Online (Sandbox Code Playgroud)

相当于

void set_S(struct S ps[1])
{
  ps->i = 40;
  ps->f = 2.;
}
Run Code Online (Sandbox Code Playgroud)

相当于

void set_S(struct S * ps)
{
  ps[0].i = 40;
  ps[0].f = 2.;
}
Run Code Online (Sandbox Code Playgroud)

相当于

void set_S(struct S ps[1])
{
  ps[0].i = 40;
  ps[0].f = 2.;
}
Run Code Online (Sandbox Code Playgroud)

一元素数组方法:

typedef struct S Array_of_S_with_size_1[1];

int main(void)
{
  Array_of_S_with_size_1 array_of_S_with_size_1;
  array_of_S_with_size_1[0].i = 0;
  array_of_S_with_size_1[0].f = 0.;

  set_S(array_of_S_with_size_1);

  ...
}
Run Code Online (Sandbox Code Playgroud)

上面main()提供了与以下相同的功能:

int main(void)
{
  struct S s;
  s.i = 0;
  s.f = 0.;

  set_S(&s);

  ...
}
Run Code Online (Sandbox Code Playgroud)

我没有看到使用“单元素数组”方法有任何收获。预期可能是&键盘上的 - 键损坏......;-)