2차원 배열(더블포인터) 해제하는법좀 제발 급해요!!!
꽃햇님
질문 제목 : 2차원 배열 malloc 함수로 동적 할당을 받아 행렬 두개를 파일에 저장하고, 파일에서 부른 두 행렬의 합을 구하는 함수를 만들어라
알고리즘 다 됬고 다 만들었습니다 근데 문제는 더블 포인터로 된 3개의 배열(두개의 배열+결과 저장할 배열) 이 free 를 하게 되면 에러가 납니다..(코딩 오류 말고 돌려보면 나는 오류).. 봐주세요 ㅠㅠ
질문 내용 : 전체 코드가 많이 깁니다 어짜피 보셔야 할 부분만 필요하니 체크 해놨습니다
혹시 전체 코드 필요하실까봐 밑에 추가
---------------------요약본----
arr=(int**)malloc(n2*sizeof(int)); //열 만들기 ,n1이 행값,n2가 열값
for(i=0; i(n1+n2); i++) // 행 만들기
{
arr[i]=(int*)malloc(n1*sizeof(int));
}
for(i=0;i!=(n1); i++) //동적할당 해제(이 부분이 문제, 잘못된게 없는것 같은데 컴파일시 오류 없고 , 돌려보면 마지막 다 실행하면 에러남
{
free(*(arr+i));
}
free (arr);
------요약본--------------------
#includestdio.h
#includestdlib.h
void main()
{
int n1,n2,n3=0;
int **arr,**arr2,**arr3;
int i,j;
file *fp=fopen(test.dat,wb);
void array_check(int a,int b,int **arr); // 행렬값 체크용
void array_input(int a,int b,int **arr); // 행렬값 입력용
void mul_mat(int n1,int n2,int n3,int**pm1,int **pm2,int** pm3); //두 행렬 덧셈용
if(fp==null) printf(오류\n);//fp에 대한 예외처리구문.
printf(첫번째 행렬의 행, 열값을 입력하시오\n);
scanf(%d %d,&n1,&n2);
printf(첫번째 행렬은 %d x %d 입니다\n,n1,n2);
arr=(int**)malloc(n2*sizeof(int)); //열 만들기
for(i=0; i(n1+n2); i++) // 행 만들기
{
arr[i]=(int*)malloc(n1*sizeof(int));
}
array_input(n1,n2,arr);
array_check(n1,n2,arr);
printf(\n두번째 행렬의 열값을 입력하시오\n);
scanf(%d,&n3);
///////////////////////n1,n2,n3 값 파일에 저장///////////////////////////////////////
fprintf(fp,n1:%d, n2:%d ,n3:%d\n,n1,n2,n3);
fprintf(fp,\n);
///////////////////////n1,n2,n3 값 파일에 저장///////////////////////////////////////
printf(두번째 행렬은 %d x %d 입니다\n,n2,n3);
arr2=(int**)malloc(n3*sizeof(int));
for(i=0; i(n2+n3); i++)
{
arr2[i]=(int*)malloc(n2*sizeof(int));
}
array_input(n2,n3,arr2);
array_check(n2,n3,arr2);
///////////////////////////////////행렬 원소들 저장//////////////////////////////////
fprintf(fp,-------------첫번째 행렬-----------\n);
for(i=0; i!=n1; i++) //파일에 첫번째 행렬값 저장
{
for(j=0; j!=n2; j++)
{
if(j%n2==0) fprintf(fp,\n);
fprintf(fp,%d,arr[i][j]);
}
}
fprintf(fp,\n-------------두번째 행렬-----------\n);
fprintf(fp,\n);
for(i=0; i!=n2; i++) //파일에 두번째 행렬값 저장
{
for(j=0; j!=n3; j++)
{
if(j%n3==0) fprintf(fp,\n);
fprintf(fp,%d,arr2[i][j]);
}
}
///////////////////////////////////행렬 원소들 저장//////////////////////////////////
arr3=(int**)malloc(n3*sizeof(int)); //결과 저장할 함수(넘겨주기용)
for(i=0; i(n1+n3); i++)
{
arr3[i]=(int*)malloc(n1*sizeof(int));
}
mul_mat(n1,n2,n3,arr,arr2,arr3);
}
void mul_mat(int n1,int n2,int n3,int**pm1,int **pm2,int** pm3)
{
int i,j,k;
printf(\n pm1에 들어간거\n);
for(i=0; i!=n1; i++)
{
for(j=0; j!=n2; j++)
{
if(j%n2==0) printf(\n);
printf(%d\t,pm1[i][j]);
}
}
printf(\n\n);
printf(\n pm2에 들어간거\n);
for(i=0; i!=n2; i++) /// pm1,pm2 제대로 들어갔나 확인
{
for(j=0; j!=n3; j++)
{
if(j%n3==0) printf(\n);
printf(%d\t,pm2[i][j]);
}
}
printf(\n);
printf(\n);
//------------------------------pm3 계산하는과정--------------------------------
for(i=0; i!=n1; i++)// pm3[i][j]+=pm1[i][k]*pm2[k][j] 연산을 하기 위해서 pm3행렬의 모든 원소를 0으로 초기화 해줌.
{
for(j=0; j!=n3; j++)
{
pm3[i][j]=0;
}
}
for(i=0; i!=n1; i++)// 3개의 인덱스를 사용하여 pm3 행렬을 계산한다. 행렬 연산 과정에 따라서 for 루프는 제일 안쪽에 k변수(n2),가운데 j변수(n3), 제일 바깥쪽에 i변수(n1)를 배치하였다.
{
for(j=0; j!=n3; j++)
{
for(k=0; k!=n2; k++)// pm3계산을 위해서 k라는 인덱스 하나를 추가함(기존의 i와 j가 n1과 n3가 대응하는 것 이었듯이, k는 n2에 대응하는 것이다. 기존의 k자리에 0과 1을 사용했던 것과는 대조적으로 모든 경우에 대비할수있다. ex 과거 n2==0일때 쓰레기값이 나오던 문제와같은..)
{
pm3[i][j]+=pm1[i][k]*pm2[k][j];// good idea!
}
}
}
printf(\n두 행렬을 곱한값은 아래와 같다\n);
for(i=0; i!=n1; i++)
{
for(j=0; j!=n3; j++)
{
if(j%n3==0) printf(\n);
printf(%d\t,pm3[i][j]);
}
}
for(i=0;i!=(n1); i++)
{
free(*(pm+i));
}
free (pm);
for(i=0;i!=(n2); i++)
{
free(*(pm2+i));
}
free(pm2);
for(i=0;i!=(n1); i++)
{
free (*(pm3+i));
}
free(pm3);
}
void array_input(int a,int b,int **arr) // 배열값 입력 함수
{
int i,j;
for(i=0; i!=a; i++)
{
for(j=0; j!=b; j++)
{
printf(%d행 %d 열 원소 입력\n,i+1,j+1);// 프로그래밍상 배열은 0행0렬부터 시작하지만 실제 행렬은 1행1렬부터 시작하므로 i와 j에 +1을 해준듯..
scanf(%d,&arr[i][j]);
}
}
}
void array_check(int a,int b,int **arr) // 배열값 체크 함수
{
int i,j;
for(i=0; i!=a; i++)
{
for(j=0; j!=b; j++)
{
if(j%b==0) printf(\n);
printf(%d\t,arr[i][j]);
}
}
}
-
엘보어
행을 만든 후, 열을 만드세요.