동적 할당과 포인터 참조의 NULL에 관한 질문입니다.

#include <stdio.h>
#include <stdlib.h>

void show_square(int** square, int size) {								//틀 출력

	int i;
	static int show = 0;

	for (i = 0; i < size; i++) {
		for (int j = 0; j < (4 * size) + 1; j++) printf("-");
		printf("\n");
		for (int k = 0; k < size; k++) {
			if (show == 0) printf("|%3d", (i * size) + k + 1);				//각 자리에 대한 번호 명시
			else if (**square == NULL) printf("|   ");
			else printf("|%3d", square[i][k]);
		}
		printf("|\n");
	}
	for (i = 0; i < (4 * size) + 1; i++) printf("-");

	show++;
}

int malloc_arr(int*** arr, int size) {					//메모리 동적 할당
	*arr = (int**)malloc(sizeof(int*) * size);
	for (int i = 0; i < size; i++) (*arr)[i] = (int*)malloc(sizeof(int) * size);
	if (*arr == 0) return 1;
	else return 0;
}

void free_arr(int*** arr, int size) {					//동적 할당된 메모리 해제

	for (int i = 0; i < size; i++) free((*arr)[i]);

	free(*arr);

}

아직 만드는 중이라 아직 쓰지 않은 부분도 있지만 그건 무시해주시면 감사하겠습니다.
요점은 이중 포인터의 동적 할당을 하는 좀 더 효율적이고 안전한 방법이 있는지,
그리고 show_square 함수에 for 안의 else 구문입니다.
한 번 자신을 호출하면 그 이후 호출은 다른 출력을 보이는 형태입니다.
저 구문에 따르면 포인터의 참조 값은 NULL 값이라 else if를 타고 출력할 때 공백으로 출력되어야 하는데 조건문을 잘못 쓴건지 어떻게 해야할지 모르겠습니다.

이건 *arrmalloc으루 할당받자마자 해야할 것 같고, 그 이후에 순회하며 malloc 할 때도 매번 체크해 주어야 할 것 같습니다. 대신 return 1 하기 전에 그때까지 할당받은 것들은 free 해주고요.

감사합니다 중요한 걸 생각 못 했었네요

안녕하세요.

배열처럼 쓰시려면 한번에 malloc을 할당하셔도 되고요.
할당받은 포인터를 리턴하시는 쪽으로 구현하시면 더 간단해질거 같습니다.

한번에 할당받으면 한번에 free가 가능하니 free함수도 간단해지겠지요

동적할당 함수에 1과 0으로 리턴값을 지정한 것은 포인터의 동적할당과 동시에 함수가 제대로 작동했는지 여부를 main 함수까지 반영해야했기에 그렇게 했던 것이고, 한 번에 할당하라는 말씀은 *arr = (int**)malloc(sizeof(int*) * size); for (int i = 0; i < size; i++) (*arr)[i] = (int*)malloc(sizeof(int) * size); 를 간략화 할 수 있다는 말씀이신 것 같은데 어떻게 할 수 있는지 잘 모르겠습니다.

malloc 함수는 성공과 실패를 어떻게 표현하는지 생각해보세요.
한번에 할당 하라는 말은 3 X 10이라면 10을 3번 할당하지 말고 30을 한번에 할당하라는 거죠.

@Lukas_J_Han 님 말씀은 다차원 배열이 사실은 1차원 배열과 같이 일렬로 이어진 메모리 공간인 것처럼 malloc_arr에서도 그렇게 하라는 거죠.

그러면 따로만든 함수가 필요없죠?

그렇군요 2차원 배열처럼 쓸 거란 생각에 동적할당도 비슷한 구조로 해버렸네요 감사합니다

malloc 함수가 어떻게 할당 성공과 실패를 표현하는지도 찾아보셨나요?

네 실패시 NULL값을 성공시 void pointer 형태의 할당한 주솟값을 반환하더군요. 그래서 실패 여부를 판단하는 구문도 간단해졌습니다. 감사합니다.

1 Like