首页 > 解决方案 > 如何将二维数组静态初始化为指向指针的指针?

问题描述

我有一个结构,说它foo看起来像这样,

struct foo {
    size_t n;
    size_t **point;
};

结构中还有其他成员,他们对问题并不重要。现在,我想静态初始化结构。

int main(void)
{
    struct foo *bar = &(struct foo){
                       .n=4,
    /* ERROR HERE */   .point=(size_t[][n]){ {1, 2, 3, 4}, {5, 6, 7, 8}}
    };
    return 0;
}

指示的行中有两个问题。首先,可以理解的是编译器无法识别n,有没有什么办法可以在不创建变量的情况下做类似的事情?其次,也是最重要的,我意识到我不知道如何创建一个二维数组并将其静态分配给指向指针的指针。请帮忙。我尝试了以下变体,但没有任何效果。

/* Variation 1 */   .point=(size_t[][4]){ {1, 2, 3, 4}, {5, 6, 7, 8}}
/* Variation 2 */   .point=(size_t**)(size_t[][4]){ {1, 2, 3, 4}, {5, 6, 7, 8}}
/* Variation 3 */   .point=&(size_t[][4]){ {1, 2, 3, 4}, {5, 6, 7, 8}}

标签: carrayspointersstruct

解决方案


请注意,这在技术上不是二维数组,而是指针到指针的数组。但是由于复合文字不能具有可变长度数组类型,而且您似乎不想使用硬编码维度,这可能是唯一的方法。

您需要将数组拆分为未知大小的一维数组,并为它们使用单​​独的复合文字:

struct foo * bar = &(struct foo){
    .n = 4,
    .point = (size_t*[]){
        (size_t[]){1, 2, 3, 4}, 
        (size_t[]){5, 6, 7, 8}
    }
};

推荐阅读