Добрый день. Тут прочитал великое писание, и захотел наконец разобраться с указателями и динамическим выделением памяти. Наваял быдлокода. До этого только писал на бедоне. Пожалуйста укажите что я делаю неправильно.
#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: Извините за табы.



