Хранить треугольную матрицу эффективно

Мне нужно эффективно хранить нижнюю треугольную матрицу, не сохраняя все нули в памяти, поэтому я подумал об этом следующим образом: сначала я выделяю память для каждой строки, затем для каждой строки я выделяю i + 1 байт, поэтому я никогда надо беспокоиться о нулях, но что-то не так при первом распределении. Что я делаю неправильно? Это мой код, и компилятор выходит из программы в строке 8 сразу после считывания размера матрицы.

#include <stdio.h>
#include <stdlib.h>

int main ()
{
  int i, j, **mat1, dim;

  scanf("%d",&dim);
  *mat1 = (int**)calloc(dim, sizeof(int*));

  for(i = 0; i<dim; i++)
    mat1[i] = (int*)calloc(i+1, sizeof(int));

  for(i = 0; i < dim; i++)
    for(j = 0; j < i+1; j++)
       scanf("%d", &mat1[i][j]);

  for(i=0; i<dim; i++)
    for(j=0; j<(i+1); j++)
       printf("%d%c", mat1[i][j], j != (dim-1) ? ' ' : '\n');

  return 0;
}

РЕДАКТИРОВАТЬ

Итак, после изменения кода, как вы мне помогли, я должен прочитать верхнюю треугольную и нижнюю треугольную матрицы и показать их продукт. Проблема в том, что я не храню нули в памяти, поэтому, если я использую традиционный алгоритм 3-for, он будет показывать некоторые ненужные значения. И если я инициализирую оставшуюся часть каждой матрицы с 0, бесполезно динамически выделять память, потому что у меня также будут храниться нули, поэтому я ничего не сделал для улучшения эффективность хранилища. Я думаю, что мне нужно где-то модифицировать код, или, может быть, для интервалов, но в любом случае я изменяю программу, все еще выводящую (для матрицы 3х3) 2 ненужных значения в верхнем правом углу. Как я могу это сделать?

#include <stdio.h>
#include <stdlib.h>
int main ()
{
int i,j,k,**mat1,**mat2,**prod,dim;


printf("Give dimension: \n");
scanf("%d",&dim);

mat1 = (int**)calloc(dim,sizeof(int*));

for(i=0; i<dim; i++)
    mat1[i] = (int*)calloc(i+1,sizeof(int));

mat2 = (int**)calloc(dim,sizeof(int*));

for(i=dim-1; i>-1; i--)
    mat2[i]=(int*)calloc(i+1,sizeof(int));

prod = (int**)calloc(dim,sizeof(int*));
for(i=0; i<dim; i++)
    prod[i] = (int*)calloc(dim,sizeof(int));

printf("Give lower triangular matrix(non 0 values only): \n");
for(i=0; i<dim; i++)
    for(j=0; j<i+1; j++)
        scanf("%d",&mat1[i][j]);

printf("Give upper triangular matrix(non 0 values): \n");
for(i=0; i<dim; i++)
    for(j=i; j<dim;j++)
        scanf("%d",&mat2[i][j]);

printf("Matrix A is: \n");
for(i=0; i<dim; i++)
    for(j=0; j<dim; j++)
        printf("%d%c",j<=i?mat1[i][j]:0,j!=dim-1?' ':'\n');

printf("Matrix B is: \n");
for(i=0; i<dim; i++)
    for(j=0; j<dim; j++)
        printf("%d%c",j>=i?mat2[i][j]:0,j!=dim-1?' ':'\n');

for(i=0; i<dim; i++)
    for(j=0; j<dim; j++)
        for(k=0; k<dim; k++)
            prod[i][j]+=mat1[i][k]*mat2[k][j];


printf("The product of the two matrix is: \n");
for(i=0; i<dim; i++)
    for(j=0; j<dim; j++)
        printf("%d%c",prod[i][j],j!=dim-1?' ':'\n');


return 0;

}

Ответы на вопрос(3)

Ваш ответ на вопрос