Добрый день. Тут прочитал великое писание, и захотел наконец разобраться с указателями и динамическим выделением памяти. Наваял быдлокода. До этого только писал на бедоне. Пожалуйста укажите что я делаю неправильно.
#include <stdio.h>
#include <stdlib.h>
struct T **init(int *size);
void extend(struct T ***arr, int *size);
void freeall(struct T ***arr, int *size);
struct T
{
int i;
};
int main(int argc, char *argv[])
{
int arrsize = 5;
int i;
struct T **arrt;
arrt = init(&arrsize);
for (i = 0; i < arrsize; i++) {
arrt[i]->i = ((i + 1) * (i + 1));
}
for (i = 0; i <= 5; i++) {
extend(&arrt, &arrsize);
arrt[arrsize - 1]->i = (arrsize * arrsize);
}
for (i = 0; i < arrsize; i++) {
printf("%d\n", arrt[i]->i);
}
freeall(&arrt, &arrsize);
return 0;
}
struct T **init(int *size)
{
int i;
struct T **arrt;
arrt = calloc(*size, sizeof(int *));
if (!arrt) {
fprintf(stderr, "error\n");
exit(1);
}
for (i = 0; i < *size; i++) {
arrt[i] = calloc(1, sizeof(struct T *));
if (!(arrt[i])) {
fprintf(stderr, "error\n");
exit(1);
}
}
return arrt;
}
void extend(struct T ***arr, int *size)
{
int oldsize = (*size)++;
*arr = realloc(*arr, (sizeof(int *) * *size));
if (!(*arr)) {
fprintf(stderr, "error\n");
exit(1);
}
(*arr)[oldsize] = calloc(1, sizeof(struct T *));
if (!((*arr)[oldsize])) {
fprintf(stderr, "error\n");
exit(1);
}
}
void freeall(struct T ***arr, int *size)
{
int i;
for (i = 0; i < *size; i++) {
free((*arr)[i]);
}
free((*arr));
}
PS: Извините за табы.