首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从C中的函数返回数组?

如何从C中的函数返回数组?
EN

Stack Overflow用户
提问于 2016-10-06 13:23:39
回答 2查看 10K关注 0票数 1

大多数网站都这样说:

C编程不允许将整个数组作为参数返回给函数。但是,可以通过在没有索引的情况下指定数组的名称来返回指向数组的指针。

我刚刚开始使用指针,据我所知,指针变量是存储内存地址的变量。当我们使用*取消引用时,我们到达那个内存地址并保存存储在那里的值。此外,对于数组,指针必须指向第一个元素。

现在,如果我们的函数返回指向数组第一个元素的指针,如本例所示:

代码语言:javascript
复制
int * myFunction() {
   .
   .
   .
}
  1. 我们要怎么取消它?
  2. “返回指针的函数”是否意味着返回指针指向的内存地址?

在这种情况下,

第二点要记住的是,C不主张将局部变量的地址返回到函数外部,因此必须将局部变量定义为静态变量。

  1. 究竟什么是是一个静态变量?我已经冲浪够多了,但没有发现任何统计数据。维基百科维护者:

在计算机编程中,静态变量是静态分配的变量,使其生存期或“范围”扩展到整个程序运行期间。

另一个网站说,

静态存储类指示编译器在程序的生命周期内保持局部变量的存在,而不是每次程序进入或超出作用域时都创建和销毁它。

有人请给我一个清晰和基本的解释,什么是静态变量,以及它在这个上下文中的相关性(从函数返回数组)。

我真的很困惑。

EN

回答 2

Stack Overflow用户

发布于 2016-10-06 13:33:42

我们要怎么取消它?

函数返回的指针变量。

通过使用适当的操作符*,有一个例子:

代码语言:javascript
复制
int z = 5;
int* pointer_to_z = &z; // get memory address of z and store that in pointer_to_z
int can_i_have_my_z_back_please = *z; // check what value is at that memory address and store it, a copy is made here.

“返回指针的函数”是否意味着返回指针指向的内存地址?

它返回一个指针变量,这个变量保存值的内存地址。基本上,“指向”一个值与“拥有它的地址”是一样的。

什么是静态变量?我已经冲浪够多了,但没有发现任何统计数据。

有很多好的,所以答案是什么是静态变量已经。总之(只使用变量的生存期而不是链接)静态变量在初始化后对程序的其余部分有效,这意味着它的生存期不像局部变量那样受作用域约束:

代码语言:javascript
复制
void hello()
{
  int x = 5;
} // x destroyed here..

void hello_static()
{
  static int x = 5;
} // x will only be destroyed at the "end" of the program

这又意味着返回本地静态变量的指针(内存地址)是完全安全的,因为静态变量仍然可以访问:

代码语言:javascript
复制
int* return_my_static()
{
  static int a = 5;
  return &a;
}

int main()
{
  int* pointer_to_static = return_my_static(); // get the memory address of the static
  printf("%i", *pointer_to_static); // print out the value by dereferencing
}

但是,这样做对于本地非静态变量将导致未定义的行为,因为指向的变量(其内存地址)已被销毁,因此不再有效:

代码语言:javascript
复制
int* return_local()
{
  int a = 5;
  return &a;
} // a is destroyed here.. oopsies

int main()
{
     int* pointer_to_local = return_local(); // get the memory address of the local.
     //local variable has been destroyed now and 'pointer_to_static' now points to garbage memory!
      printf("%i", *pointer_to_local); // Try to print out the value by dereferencing, this is undefined behaviour, anything can happen.
}

请注意,上面的代码可能运行并输出预期的结果,但这纯粹是运气,这是未定义的行为,应该不惜一切代价避免,因为此时任何事情都可能发生。

票数 2
EN

Stack Overflow用户

发布于 2016-10-06 13:40:00

问题3:

代码语言:javascript
复制
int a;

void foo() {
   int b
   static int c;
}

int main() {
    foo();
}

当程序启动时,将分配a和c的内存,并一直分配到程序退出为止。所以,在任何给定的时间,都有关于a和c的。每当任何人(这里是main)调用foo时,都会在堆栈上分配b,直到该函数返回为止。

关于问题3前面的引语:

返回a和c的地址是没有问题的,因为只要程序持续,这些地址就存在,但是将地址返回给b是一个错误,因为调用者一拿到指针,指针就指向无效的内存。

问题1:

将星号放在前面,从而取消指针的引用。这个指针指向的并不重要。它是一个数组,您可以增加或减少指针,以达到您想要达到的索引,例如:*(p + 4)将访问第5个元素(因为*(p + 0)是第一个元素,所以*(p + 1)是第二个元素,依此类推)。

您也可以编写p4,而不是编写*(p + 4)。

假设您的函数如下所示:

代码语言:javascript
复制
int * myFunction() {
    static int array[8];
    return array;
}

然后返回语句将返回数组的地址,这与数组的第一个元素的地址完全相同。

因此,具有int *p= myFunction();然后可以使用直观的语法p= 42;.;p7 =23访问数组;

问题2:

返回指针的函数是返回指针的函数。指针是一种东西,它指向内存中的一个点。通常这被称为内存地址,但是C语言并不在意。因此,实际上,“返回指针的函数”意味着返回指针指向的内存地址,是的。

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

https://stackoverflow.com/questions/39897242

复制
相关文章

相似问题

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