我需要通過不將所有的零存儲在內存中來有效地存儲下三角矩陣,所以我這樣想:首先爲每一行分配內存,然後爲每一行分配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;
}
編輯
確定,所以修改代碼你幫了我的道,我要讀上三角和下三角矩陣,並展示自己的產物。問題這是我不要將0存儲在內存中,所以如果我使用傳統的3-for算法,它將顯示一些垃圾值。如果我用0初始化每個矩陣的其餘部分,則動態分配內存是無用的,因爲我會也有零存儲,所以我沒有做任何事情來提高存儲效率。我想我必須修改代碼的地方,或者可能是間隔,但無論如何,我修改公關圖仍然輸出(對於3x3矩陣)右上角的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;
}
只是說明:*編譯器*當然不是「退出」你的程序。編譯器已經完成,不再在你運行你的程序的時候,它可能會導致錯誤並提前退出。不要責怪編譯器! – unwind 2014-12-09 13:44:00