미누에요
[백준 2738번] 행렬 덧셈 - C99 본문
728x90
반응형
SMALL
행렬 크기인 n,m을 입력받아 그 크기만큼 행렬의 각 값을 입력하여 덧셈을 연선하게 하는 방식이다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int N, M;
scanf("%d %d", &N, &M);
// 입력받은 변수로 2차원 배열 '행' 할당
int **a = malloc(sizeof(int *) * N);
int **b = malloc(sizeof(int *) * M);
// 입력받은 변수로 2차원 배열 '열' 할당
for (int i = 0; i < N; i++) {
a[i] = malloc(sizeof(int *) * M);
b[i] = malloc(sizeof(int *) * M);
}
// a 배열 값 입력
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &a[i][j]);
}
}
// b 배열 값 입력
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &b[i][j]);
}
}
// 더한 값 출력
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
printf("%d ", a[i][j] + b[i][j]);
}
printf("\n");
}
// 메모리 할당 해제
for (int i = 0; i < N; i++) {
free(a[i]);
free(b[i]);
}
free(a);
free(b);
return 0;
}
위와 같이 코드를 작성했으나 계속하여 런타임 에러가 발생한다.
segfault라고 뜨는 것을 구글링 해보니 segmentation fault 라고하는 런타밍 에러의 종류인 거 같다.
아래 4개의 에러들은 C99가 아닌 C++을 이용하여 컴파일하여 생긴 에러였고, 위 5개의 에러는 메모리 할당 해제가 유력한 원인이다.
입력받은 값으로 2차원 배열의 크기를 정의하려 malloc 함수를 사용하였다.
malloc 함수는 데이터 구조상으로 힙 영역에 속해 있어 데이터 영역을 해제해야 한다.
그래서 free 함수에서 실수를 범한 것인가 확인해 보았다.
2차원 배열에서 메모리 할당 해제는 저렇게 두 번 하는 게 맞다.
망할 . 한시간째 못 풀었다.
다음에 다시 봐야겠다..
728x90
반응형
LIST
'알고리즘' 카테고리의 다른 글
[백준 1271번] 엄청난 부자2 - C99 (0) | 2023.06.06 |
---|---|
[백준 2738번] 행렬 덧셈 - 2 (0) | 2023.06.06 |
[백준 1009번] 분산처리 - C99 (0) | 2023.06.03 |
[백준 23825번] SASA 모형을 만들어보자 - C99 (0) | 2023.06.03 |
[백준 19698번] 헛간 청약 - C99 (0) | 2023.06.03 |