当代码必须在 main 的第二个 for 循环中通过 c.foos 访问 foo 元素时,代码无法正常工作(段错误)。
它只正确显示第一个元素,然后在 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()
分配了所需指针的数量。
最佳答案
关于c - ptr*** 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7377240/