当代码必须在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如果不为表达式设置父级,则“[”在“*”之前计算。