创建静态全局可变长度二维数组

Creating a static global, variable length 2D array

我正在尝试创建满足以下要求的数组:

我一直在使用下面的代码来创建一个 VLA,它几乎可以满足我的要求,但是这个数组仅限于当前范围,而不是具有内部链接。

int (*array_name)[columns] = malloc( sizeof(int[rows][columns]) );

有什么方法可以创建满足我所有需求的数组吗?


Edit - "static global" 是此类变量作用域的错误术语,"internal linkage" 是正确的。请查看对此问题的评论以获得解释。

您可以按如下方式定义数组:

int **array;

然后这样分配:

array = malloc(rows * sizeof (int *));
for (i=0; i<rows; i++) {
    array[i] = malloc(cols * sizeof(int));
}

不,不可能创建这样的数组。您不能在全局 space 中创建 VLA:s,因为全局是静态的,静态对象需要在编译时定义它们的大小。

你可以做的是使用这样的东西:

int **arr;

int foo() // Or main, or any function
{
    arr = malloc(sizeof(*arr) * rows);
    for(int i=0; i<rows; i++)
        arr[i] = malloc(sizeof(*arr[0]) * cols);

当然,rowscols需要声明和初始化,还要检查是否分配失败。我在这里省略了。

是的,您可以使用 []。括号运算符只是指针运算的语法糖。 a[i] 等同于 *(a+i).

请求的属性可以如下所述完成。 (不建议这样做。)

定义基指针和数组大小:

static void *MyArrayPointer;
static size_t Columns;

当数组大小已知时,初始化它们:

Columns = some value;
MyArrayPointer = malloc(Rows * Columns * sizeof(int));
if (!MyArrayPointer) ... Handle error ...

定义一个宏作为数组:

#define MyArray ((int (*)[Columns]) MyArrayPointer)

完成上述操作后,可以访问数组 MyArray[i][j]

请注意,可变长度数组支持在 C 中是可选的。GCC 和 Clang 支持它们。鉴于问题中显示的示例,我们假设可变长度数组支持可用。

此外,我很想写 malloc 代码:

MyArrayPointer = malloc(Rows * sizeof *MyArray);

这样做的好处是可以在 MyArray 中使用的类型发生变化时自动调整分配。