c - 多维数组的超出范围声明

标签 c arrays multidimensional-array declaration

此问题引用此处提供的解决方案/解释Allocating variable length multi dimensional arrays (请参阅已接受的答案)。

在我的例子中,我使用相同的函数来定义 3D 数组,如下所示

void arr_alloc (int x, int y, int z, int(**aptr)[x][y][z])
{
  *aptr = malloc( sizeof(int[x][y][z]) ); // allocate a true 3D array
  assert(*aptr != NULL);
} 

对于我正在开发的代码库(这是一个巨大的项目存储库),之前我使用的是指向类型指针(***数组)的指针,然后进行交错,以便我可以将其用作 3D(伪)大批。为此,我将变量声明为 extern int ***array ,并在单独的头文件中将指针定义为 int ***array 。我的问题 - (a) 对于新函数,数组的声明和定义应该是什么,因为 SO 引用答案使用声明和定义,例如

int x = 2;
int y = 3;
int (*aptr)[x][y];

(b) 考虑到 size_t 占用 8 个字节,而 int 占用 8 个字节,因此使用 size_tint 作为索引变量的动机code>占用4个字节。

PS。我在上面提到的声明和定义行之后(也在 SO 答案中)在 gdb 中检查了变量类型,即 (int (*)[variable length][variable length][variable length]) 0x0

编辑:请注意,这个问题是关于数组/数组指针的声明和定义,而不是关于分配和设置数组的函数的声明。

最佳答案

函数声明对于分配 3D 数组是正确的。指向此类数组的指针的类型为 int (*)[a][b][c] ,因此该函数需要接受该类型的指针的地址才能写入它,即 int (**)[a][b][c] ,这就是你所拥有的。

要使用此函数,您需要按如下方式调用它:

int s1=2, s2=3, s3=4;
int (*p)[s1][s2][s3];
arr_alloc(s1,s2,s3,&p);

然后你可以像这样写入 3D 数组:

int i,j,k;
int n = 0;
int i,j,k;
int n = 0;
for (i=0;i<s1;i++) {
    for (j=0;j<s2;j++) {
        for (k=0;k<s3;k++) {
            (*p)[i][j][k] = n++;
        }
    }
}

编辑:

真正的多维数组必须声明除第一个维度之外的所有维度的大小。如果您的数组是在文件范围内声明的,则意味着这些维度的大小必须是编译时常量。

如果尺寸必须改变,您需要将其设为 void *并根据需要进行转换。您在这里失去了一些类型检查,但这是执行此操作的唯一方法:

int s1, s2, s3;
void *arr;

void arr_alloc (int x, int y, int z)
{
  int (*p)[x][y][z] = malloc( sizeof(int[x][y][z]) );
  assert(p != NULL);
  arr = p;
  s1=x;
  s2=y;
  s3=z;
}

int main()
{
    arr_alloc(2,3,4);
    int (*p)[s1][s2][s3] = (int(*)[s1][s2][s3])arr;

    int i,j,k;
    int n = 0;
    for (i=0;i<s1;i++) {
        for (j=0;j<s2;j++) {
            for (k=0;k<s3;k++) {
                    (*p)[i][j][k] = n++;
            }
        }
    }
    for (i=0;i<s1;i++) {
        for (j=0;j<s2;j++) {
            for (k=0;k<s3;k++) {
                    printf("%d:%d:%d=%d\n",i,j,k,(*p)[i][j][k]);
            }
        }
    }
    free(p);
    return 0;
}

关于c - 多维数组的超出范围声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49928031/

相关文章:

javascript - 在 Jscript 中为 Q.all() 构建动态函数数组

arrays - 仅针对具有 objective-c 元素的数组的 Swift 扩展可能吗?

c - 遍历指针到指针

php - 使用 array_walk_recursive 从类中调用函数

java - 在二维数组中查找行的最大值和列的最小值

在c中使用opencv裁剪图像

c - 是否可以使函数从堆栈上的字符串执行代码?

c - 为什么我的 while 循环忽略 NULL 条件?

c - FTP 服务器何时接受客户端的被动数据连接?

c - 如何使用命令参数?