创建静态全局可变长度二维数组
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);
当然,rows
和cols
需要声明和初始化,还要检查是否分配失败。我在这里省略了。
是的,您可以使用 []
。括号运算符只是指针运算的语法糖。 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
中使用的类型发生变化时自动调整分配。
我正在尝试创建满足以下要求的数组:
- 内部链接(静态全局)
- 大小仅在运行时已知
- 使用
[][]
语法访问的元素 - 存储在堆上
我一直在使用下面的代码来创建一个 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);
当然,rows
和cols
需要声明和初始化,还要检查是否分配失败。我在这里省略了。
是的,您可以使用 []
。括号运算符只是指针运算的语法糖。 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
中使用的类型发生变化时自动调整分配。