当代码必须在main的第二个for循环中通过c.foos访问foo元素时,代码不能正常工作(segfault)。
它只正确地显示第一个元素,然后在i=1时显示垃圾,在i=2时最终崩溃。
所以我想这和指针数学有关。
如何正确操作数据结构是不允许更改的(不,这不是一个家庭作业,而是一个过于简化的this数据结构的POC)。

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

typedef struct _foo {
    int i;
} foo;

typedef struct _foo_container {
    foo ***foos;
} container;

foo** init_foos(void) {
    foo** f;
    int i;

    f = malloc(sizeof(foo*)*3);

    for(i=0; i < 3; i++) {
        f[i] = malloc(sizeof(foo));
        f[i]->i = i*11+1;
    }
    return f;
}

int main(void) {
    container c;
    foo **foos;

    foos = init_foos();

    c.foos = &foos;
    int i;
    for(i=0; i < 3; i++) {
        printf("%d %d\n", i, foos[i]->i);
    }
    for(i=0; i < 3; i++) {
        printf("%d %d\n", i, (**c.foos[i]).i);
    }
    //memory leaks, I know

    return EXIT_SUCCESS;
}

注意:这个代码似乎是有效的我想自从上次gcc升级之后也发生了一些事情,尽管我可能仍然做错了什么。
补遗:很抱歉大家错过了*3,我很快就写了这个POC。实际代码确实通过php的safe_emalloc()分配了所需指针的数量。

最佳答案

尝试:

printf("%d %d\n", i, (*(*c.foos)[i]).i);

我认为问题在于操作员precedence如果不为表达式设置父级,则“[”在“*”之前计算。

07-24 22:06