我正在制作一个随机的n * n矩阵,但在程序运行之前我不知道n的值。
我能够在main()中创建n * n矩阵,如下所示:
double (*m1)[n];
m1 = malloc(sizeof *m1 * n);
double (*m2)[n];
m2 = malloc(sizeof *m2 * n);
但是现在我必须在main之外使用这些矩阵并且需要它们是全局的,但我完全不知道如何使它们成为全局的。我打算用多个线程读取这两个矩阵,并且需要它们易于访问。我知道我可以创建一个结构来传递多个参数,但是我需要在全局范围内定义一个带有可变长度数组的结构,以便解决问题。谢谢你的时间。
答案 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;
}
答案 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);
}
当然,如果您从多个线程访问它,您必须始终使用互斥锁保护数据。