You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将运行时确定大小的已分配数组放入结构体?

编译时大小未知的3D数组作为结构体成员的实现方案

为了处理编译时大小未知的3D数组,我编写了可正常运行的程序,支持通过my_array[][][]语法访问数组元素,且仅分配一块内存。现在我希望将该数组作为结构体的成员,但不想使用以下两种实现方式:

  • 一维数组:通过my_struct.my_array[i_x*dim3D.y*dim3D.z+i_y*dim3D.z+i_z]计算索引访问
  • 多内存块:如int**、int*数组这类需要分配多块内存的方式

参考相关思路后,我使用类型转换技巧编写了不依赖柔性数组(FAM)的实现,这样结构体中可以包含多个数组,仅需在函数开头添加一行转换代码即可,具体代码如下:

初始实现代码

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

typedef struct {
  int x,y,z;
} dim3D_t;

void print_array(dim3D_t *dim3D, int (*my_array)[dim3D->y][dim3D->z]) {
  for (int i_x=0; i_x<dim3D->x; i_x++)
    for (int i_y=0; i_y<dim3D->y; i_y++)
      for (int i_z=0; i_z<dim3D->z; i_z++)
        printf("%d %d %d : %d\n",i_x,i_y,i_z,my_array[i_x][i_y][i_z]);
}

void alloc_and_init_array(dim3D_t *dim3D, int (**my_array)[dim3D->y][dim3D->z]) {

  *my_array = malloc( sizeof(int) * dim3D->x * dim3D->y * dim3D->z );
  for (int i_x=0; i_x<dim3D->x; i_x++)
    for (int i_y=0; i_y<dim3D->y; i_y++)
      for (int i_z=0; i_z<dim3D->z; i_z++)
        (*my_array)[i_x][i_y][i_z]=100*i_x+10*i_y+i_z;
}

int main() {
  dim3D_t dim3D;
  int (*my_array)[dim3D.y][dim3D.z];
  
  scanf("%d %d %d", &dim3D.x, &dim3D.y, &dim3D.z);  
  alloc_and_init_array(&dim3D, &my_array);        
  
  print_array(&dim3D, my_array);
}

优化后实现代码

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

typedef struct {
  int x,y,z;
  int *array;
} dim3D_t;


void print_array(dim3D_t *dim3D) {

  int (*cast_dim3Darray)[dim3D->y][dim3D->z] = (int(*)[dim3D->y][dim3D->z]) dim3D->array; // 类型转换
  
  for (int i_x=0; i_x<dim3D->x; i_x++)
    for (int i_y=0; i_y<dim3D->y; i_y++)
      for (int i_z=0; i_z<dim3D->z; i_z++)
        printf("%d %d %d : %d\n",i_x,i_y,i_z,cast_dim3Darray[i_x][i_y][i_z]);
}

void alloc_and_init_array(dim3D_t *dim3D) {

  dim3D->array = malloc( sizeof(int) * dim3D->x * dim3D->y * dim3D->z );
  
  int (*cast_dim3Darray)[dim3D->y][dim3D->z] = (int(*)[dim3D->y][dim3D->z]) dim3D->array; // 类型转换
  
  for (int i_x=0; i_x<dim3D->x; i_x++)
    for (int i_y=0; i_y<dim3D->y; i_y++)
      for (int i_z=0; i_z<dim3D->z; i_z++)
        cast_dim3Darray[i_x][i_y][i_z]=100*i_x+10*i_y+i_z;
}

int main() {
  dim3D_t dim3D;
  
  scanf("%d %d %d", &dim3D.x, &dim3D.y, &dim3D.z);  
  alloc_and_init_array(&dim3D); 
        
  print_array(&dim3D);
  
}

内容的提问来源于stack exchange,提问作者Stef1611

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:37:19