Код не работает должным образом (segfault), когда он должен получить доступ к элементам foo через c.foos во втором цикле for в main.
Он только правильно отображает элемент fist, тогда при i =1 показывает мусор, и при i = 2 он, наконец, падает.
Так что я думаю, что это связано с математикой указателя.
Как это сделать правильно?Структуры данных не могут изменяться (нет, это не домашняя работа, это слишком упрощенный 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()
.