如何在C中声明全局变量大小的2D数组?

时间:2017-10-11 05:35:37

标签: c arrays matrix

我正在制作一个随机的n * n矩阵,但在程序运行之前我不知道n的值。

我能够在main()中创建n * n矩阵,如下所示:

    double (*m1)[n];
    m1 = malloc(sizeof *m1 * n);

    double (*m2)[n];
    m2 = malloc(sizeof *m2 * n);

但是现在我必须在main之外使用这些矩阵并且需要它们是全局的,但我完全不知道如何使它们成为全局的。我打算用多个线程读取这两个矩阵,并且需要它们易于访问。我知道我可以创建一个结构来传递多个参数,但是我需要在全局范围内定义一个带有可变长度数组的结构,以便解决问题。谢谢你的时间。

2 个答案:

答案 0 :(得分:3)

只需声明为双指针并在main中分配内存。有关详细信息,请参阅this

#include <stdio.h>
int **a;
void fun(int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            printf("%d ",a[i][j]);
    }
}
int main(void) 
{
    int n;
    scanf("%d",&n);
    a = (int **)malloc(n * sizeof(int *));
    for(int i=0;i<5;i++)
    {
        a[i]=(int*)malloc(n*sizeof(int));
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    fun(n);
    return 0;
}

工作代码:https://ideone.com/OMQ4qA

答案 1 :(得分:3)

正确,正确的解决方案是不使用全局变量。在线程中分配数组,这将在整个程序的执行过程中持续存在。

如果由于未知的原因而不是一个选项,那么您将不得不想出一些全局存储数组大小的解决方案。您可以为此创建一个简单的ADT,例如带有&#34; mangled&#34;的结构。灵活阵列成员形式的2D阵列。例如:

#include <stdlib.h>
#include <stdio.h>

typedef struct
{
  size_t x;
  size_t y;
  double array [];
} double_array2d_t;

double_array2d_t* array2d = NULL;

int main()
{
  /* let x and y be some manner of run-time values: */
  int x = 3;
  int y = 2;

  array2d = malloc(sizeof(*array2d) + sizeof(double[x][y]));
  array2d->x = x;
  array2d->y = y;

  double count = 0.0;
  for(int i=0; i<x; i++)
  {
    for(int j=0; j<y; j++)
    {
      array2d->array[i*y + j] = count++;
      printf("%f ", array2d->array[i*y + j]);
    }
    printf("\n");
  }

  ...

  free(array2d);
}

当然,如果您从多个线程访问它,您必须始终使用互斥锁保护数据。