【问题标题】:Return 2D array using static keyword in C在 C 中使用 static 关键字返回二维数组
【发布时间】:2020-05-30 16:14:24
【问题描述】:

我试图从 C 中的函数返回 2D 整数数组。我能够使用 malloc() 使用动态内存分配返回它,但我无法理解如何使用 static 关键字来做到这一点。

下面是使用static关键字成功返回二维数组的代码sn-p,

int (*(get_2d_arr_using_static)())[10]    // Can someone explain me this statement in detail ?
{
    static int arr[10][10] = { { 1,2,3}, {4,5,6}, {7,8,9}};
    return arr;
}

int main()
{
  int (*arr)[10] =  get_2d_arr_using_static();  // Need some insights on this statement too 
  printf("Result ( x: 3, y =3 ): \n");
  for (int i = 0; i < 3; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      printf(" %d", arr[i][j]);
    }
    printf("\n");
  }
}

我需要对评论的陈述进行一些解释。

【问题讨论】:

  • 为什么这个标签是c++?这是普通的 C 语言,而不是你在 C++ 中的处理方式。这两种语言非常不同。
  • 方便的工具:cdecl.org
  • 我这样做是因为大多数 C++ 程序员都有 C 经验,我希望这个问题也能传达给他们。其次,这段代码使用 gcc 和 g++ 给出了准确的输出。所以从技术上讲,它也是有效的 C++ 代码。
  • 问这样一个问题的好方法是写下你的想法,陈述你的推理,然后问你是否正确。如果你错了,有人会纠正你。如果你是对的,那就太好了。有人可能会提供更多详细信息或警告,您就可以开始了。
  • @user4581301,谢谢,它确实是一个有用的工具。

标签: c arrays static


【解决方案1】:

我试图从 C 中的函数返回二维整数数组。

有问题。函数不能在 C 中返回数组。

您可以返回指针,并且指针可能指向数组的元素。

该数组可以动态或静态分配。返回指向函数内声明的自动数组的指针将毫无意义,因为该数组的生命周期在超出范围时结束,因此您将返回一个悬空指针。

int (*(get_2d_arr_using_static)())[10]    // Can someone explain me this statement in detail ?

这声明了一个函数,该函数返回一个指向 10 个整数数组的指针。

需要注意的是int[10][10]是10个整数的10个数组。因此,该数组的元素是一个由 10 个整数组成的数组,并且该函数返回一个指向该元素的指针。

int (*arr)[10] =  get_2d_arr_using_static();  // Need some insights on this statement too 

这会调用该函数并初始化一个指向 10 个整数数组的指针。


也可以通过复制返回一个数组,但是是间接的。可以通过将数组包装在结构中来实现:

struct wrapper {
    int arr[10][10];
};


struct wrapper foo(void) {
     struct wrapper w;
     // fill the array or something
     return w;
}

由于您标记了 C++,我会提到 C++ 标准库有一个用于此类包装器类的模板:std::array

【讨论】:

  • 快速说明:返回一个静态分配的数组意味着整个程序只有一个数组。 get_2d_arr_using_static 的每个调用者都会获得相同的数组。这与动态分配的版本非常不同,动态分配的版本可以(并且几乎可以肯定)为每个调用者返回不同的数组。这可能会在多线程系统中导致巨大的问题,或者如果返回的指针被缓存并在代码中的多个位置使用。
  • @user4581301 更一般地说,静态存储是全局状态,应该避免使用。
猜你喜欢
  • 2016-04-04
  • 2021-12-24
  • 2014-12-22
  • 1970-01-01
  • 2011-12-30
  • 2020-07-16
  • 1970-01-01
  • 2022-01-18
  • 2022-01-16
相关资源
最近更新 更多