我想将C代码用于具有指向灵活大小数组的类型指针的成员的 struct 类型. 但是,如果类型声明中未指定数组大小,则无法访问数组元素. 不能使用Malloc(),因为数组应该是全局常量. 此外, struct "实例"应该相互引用,本例中没有涉及到的内容,因为这已经起作用了. 我是否没有为元素访问或成员声明使用正确的语法?

void up(void){
    typedef struct _sType{
        const char name[6];
        const struct _sType* (*sub)[]; // replace (*sub)[] here by (*sub)[3] for correct element access
    }sType;

    const sType s1 = {
        "S1",
        NULL,
    };

    const sType s2 = {
        "S2",
        NULL,
    };

    const sType* items[] = {
        &s1,
        &s2,
        NULL
    };

    const sType s0 = {
        "S0",
        &items
    };

    const char* dbg = s0.name; // just use s0 once for not optimizing it away 
}

我监控了他的记忆.无论 struct 成员是定义为灵活的还是固定的,Items和s0->sub的地址和值都没有区别.例如,我通过&items[0]->names0->sub[0]->name访问元素

推荐答案

sub不是VLA,而是指向不完整数组类型的指针.为了使用它,您需要将它转换为指向完整数组类型的指针.

例如:

const sType *(*arr)[2] = s0.sub;
printf("%s\n", (*arr)[0]->name);
printf("%s\n", (*arr)[1]->name);

这将打印以下内容:

S1
S2

C++相关问答推荐

是否定义了数组指针类型转换为指针类型?""""

exit(EXIT_FAILURE):Tcl C API类似功能

C中是否有语法可以直接初始化一个常量文本常量数组的 struct 成员?

为什么I2C会发送错误的数据?

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

Setenv在c编程中的用法?

在为hashmap创建加载器时,我的存储桶指向它自己

struct -未知大小

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

将回调/基于事件的C API转换为非回调API

C语言中奇怪的输出打印数组

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

分配给静态变量和动态变量的位置之间有区别吗?

哪些C++功能可以在外部C块中使用

C struct 中的冒泡排序

为什么<到达*时不会转换为>?

为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

传递参数:C 和 C++ 中 array 与 *&array 和 &array[0] 的区别

通过修改c中的合并排序对数组的偶数索引进行排序

在链表中插入一个值