수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

2차원배열(동적할당, 더블 포인터로) 해제하는법좀 제발 고수님들!!!!

하루

2023.04.01

질문 제목 : 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!
}
}br /p;}
}
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]);

}
}
}

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

번호 제 목 글쓴이 날짜
2700095 연산문제...질문... 오빤테앵겨 2025-07-01
2700070 while문 , 3의배수 출력하는 프로그램좀 짜주세욤. 횃불 2025-07-01
2700041 초보인데요 ㅎ 배열안에 배열을 집어넣을수 있나요?? 헛장사 2025-07-01
2700012 배열// (1) 전갈자리 2025-07-01
2699895 무한루프에 빠집니다.!! 해결좀부탁드려요 (10) 선아 2025-06-30
2699842 질문을 너무 많이 하네여.....죄송.... (2) 해님꽃 2025-06-29
2699816 오류 질문입니다.. (1) 해비치 2025-06-29
2699763 질문입니다 ! 꼭 좀 도와주세요ㅠㅠ (2) 미라 2025-06-28
2699555 c언어 다항식을 입력을 했는데 왜 출력이 안될까요? 피스케스 2025-06-27
2699528 C언어 포인터연산 질문입니다. (3) 안녕나야 2025-06-26
2699476 끌어올림;;달력 짜봤는데요 이 소스 줄일 수 있나요? - 스샷첨부 (2) 클라우드 2025-06-26
2699444 [좀 급함] system("explorer [주소] ") 문에 변수를 사용할 수 있나요? 알 2025-06-26
2699415 파일//read//와 배열 아란 2025-06-25
2699386 구조체 안에 일부분만 char 배열에 복사하려면 어떻게 해야하나요? (1) 미즈 2025-06-25
2699361 연결리스트 정렬하는 부분에 대해서 질문 드립니다 아이처럼 2025-06-25
2699304 [기초]아직 안주무시는분 계신가요..?포인터배열? 좀 도와주세요. 놀리기 2025-06-24
2699272 printf() 함수이용해서 프로그램 만들기 질문요! (5) 다가 2025-06-24
2699221 PUSH와 POP코드를 더 간단하게 어떻게 해야할까요? 파라미 2025-06-24
2699192 설치오류가 자꾸 나요 한번봐주세여~ (1) 소녀틳향기 2025-06-23
2699161 for loop안에 있는 if문 (9) Orange 2025-06-23
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com