Minwoo Dev.

[백준 2738번] 행렬 덧셈 - C99 본문

백준

[백준 2738번] 행렬 덧셈 - C99

itisminu 2023. 6. 6. 10:19
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