C结构中的变量2D数组

时间:2017-02-27 01:37:29

标签: c arrays struct 2d dynamic-arrays

这可能是一个简单答案的问题,但我找不到任何与之相似的问题。我试图在C中创建一个struct,它有两个变量,然后是一个二维数组,其维数等于用于创建struct的两个变量参数的维数。

struct image{
  int width;
  int hight;
  int pixles[width][height];
};

现在我知道在我编辑它之前这不起作用,但我不知道如何开始这项工作。

1 个答案:

答案 0 :(得分:0)

你不能像评论中所说的那样直接这样做。 模拟它有两种常见的习惯用法(假设支持VLA):

  1. 您只在结构中存储一个指向(动态分配的)数组的指针,然后将其转换为指向2D VLA数组的指针:

    typedef struct _Image {
        int width;
        int height;
        unsigned char * data;
    } Image;
    
    int main() {
    
        Image image = {5, 4};
    
        image.data = malloc(image.width * image.height);
        unsigned char (*data)[image.width] = (void *) image.data;
        // you can then use data[i][j];
    
  2. 如果动态分配结构,可以使用0大小的数组作为其最后一个元素(并再次将其转换为VLA指针):

    typedef struct _Image {
        int width;
        int height;
        unsigned char  data[0];
    } Image;
    
    int main() {
        Image *image = malloc(sizeof(Image) + 5 * 4); // static + dynamic parts
        image->width = 5;
        image->height = 4;
        unsigned char (*data)[image->width] = (void *) &image->data;
        // you can then safely use data[i][j]
    
  3. 如果您的C实现不支持VLA,您必须恢复到通过1D指针模拟2D数组的旧习惯用法:data[i + j*image.width]