首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对C中的一个元素数组执行一个结构的类型胡枝子子可能产生的副作用

对C中的一个元素数组执行一个结构的类型胡枝子子可能产生的副作用
EN

Stack Overflow用户
提问于 2015-05-27 09:57:50
回答 4查看 253关注 0票数 6

我偶然发现了这个密码。

代码语言:javascript
运行
复制
typedef __mpz_struct MP_INT;
typedef __mpz_struct mpz_t[1];

在这里,struct __mpz_struct是一个结构,它被类型为单个元素的数组。我知道在C中这是一个通过引用传递的技巧,然后将mpz_t作为一种类型来声明变量并将它们传递给函数作为参数。另外,还有一条评论

代码语言:javascript
运行
复制
/*
  MP_INT*, MP_RAT* and MP_FLOAT* are used because they don't have side-effects
  of single-element arrays mp*_t
*/

他们说的是什么副作用?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-27 10:21:53

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

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

示例:

代码语言:javascript
运行
复制
struct S
{
   int i;
   float f;
};

代码语言:javascript
运行
复制
void set_S(struct S * ps)
{
  ps->i = 40;
  ps->f = 2.;
}

等于

代码语言:javascript
运行
复制
void set_S(struct S ps[1])
{
  ps->i = 40;
  ps->f = 2.;
}

等于

代码语言:javascript
运行
复制
void set_S(struct S * ps)
{
  ps[0].i = 40;
  ps[0].f = 2.;
}

等于

代码语言:javascript
运行
复制
void set_S(struct S ps[1])
{
  ps[0].i = 40;
  ps[0].f = 2.;
}

单元素阵列方法:

代码语言:javascript
运行
复制
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);

  ...
}

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

代码语言:javascript
运行
复制
int main(void)
{
  struct S s;
  s.i = 0;
  s.f = 0.;

  set_S(&s);

  ...
}

我看不出使用“单元素阵列”方法有什么好处。例如,如果键盘上的&-key被打破了. ;-)

票数 2
EN

Stack Overflow用户

发布于 2015-05-27 10:17:37

我看到了你问题的两部分。第一部分是如何将参数传递给函数,最好用一个例子来说明。如果没有它,我得猜一猜。

在C函数声明中,数组参数等效于指针。。这就是为什么您看到(例如)主函数的等价性,

代码语言:javascript
运行
复制
int main(int argc, char **argv)

代码语言:javascript
运行
复制
int main(int argc, char *argv[])

类似地,如果程序中的函数将被声明

代码语言:javascript
运行
复制
int func(__mpz_struct *arg)

它相当于

代码语言:javascript
运行
复制
int func(__mpz_struct arg[])

因此,到

代码语言:javascript
运行
复制
int func(mpz_t arg)

此外,在调用端,如果您有一个类型为mpz_t的变量,因此是数组,并将其传递给一个函数,"指针衰减“将生效:在表达式中,如果使用(数组的名称),它将”衰减“为指向其第一个元素的指针。这样您就可以调用该函数:

代码语言:javascript
运行
复制
mpz_t value;
func(value);

当然,要在API函数之外修改这些mpz_t对象,您仍然必须了解它们的真实性质。

你提到的副作用,我也得猜测一下。这可能意味着您必须意识到您正在处理函数中的指针。最好使用指针语法将其显式化。

票数 2
EN

Stack Overflow用户

发布于 2017-03-20 11:14:49

您可以将一个MP_INT分配给另一个,但是不能将一个mpz_t分配给另一个,因为没有为数组定义赋值。如果您不希望您的客户端分配变量,而不是通过您的方法(可能会执行内存管理等),那么这是您的诀窍。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30479106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档