• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

2차원 배열 초기화 질문입니다

21.05.17 23:17 작성 조회수 985

0

오류안녕하세요 선생님 강의 잘 듣고 있습니다!

다름이 아니라 위 사진과 같이

scanf("%d", &n);

int a[n+2][n+2] = {0,};

2차원 배열을 초기화 하고 나서 컴파일 하니까, 첨부한 사진과 같은 Warning 메세지가 뜨면서 실행 시에는 입력을 하다 말기까지 하더라구요

( * n=5로 입력 받을 경우, 원래는 25개의 숫자가 입력받아져야 하는데 6번만 입력받더라구요 ㅜㅜ)

( * 2차원 벡터로 바꿨을 때는 정상적으로 작동했습니다)

그동안 1차원 배열로 n을 입력받고 나서

int a[n] = {0,}; 

이런 식으로는 잘 초기화 되고 할당이 되었는데, 2차원 배열의 경우는 이게 안되는 이유가 무엇인가요?

(*동적 할당..? 과 관련있는 것인가요?)

위 사진과 같은 오류 메세지는 어떨 때 생기는 오류메세지일까요? ㅜㅜ

( * [Warning] array of array of runtime bound 라고 써져 있는 부분이요,,)

* 아래는 코드 전문입니다.

#include <stdio.h>
#include <vector>
using namespace std;

int main(){
	int n, bongwoori=0;
	scanf("%d", &n);
//	vector<vector<int>> a(n+2, vector<int>(n+2, 0));
	int a[n+2][n+2] = {0,};
	
	for(int i=1; i<=n; i++){
		for(int j=1; j<=n; j++){
			scanf("%d", &a[i][j]);
		}
	}
	
	for(int i=1; i<=n; i++){
		for(int j=1; j<=n; j++){
			if(a[i][j]>a[i-1][j] 
			&& a[i][j]>a[i+1][j]
			&& a[i][j]>a[i][j-1]
			&& a[i][j]>a[i][j+1]){
				bongwoori++;
			}
		}
	}
	
	printf("%d", bongwoori);
	
	return 0;
}

답변 2

·

답변을 작성해보세요.

1

안녕하세요^^

C++동적 배열 할당은 포인터와 new 연산자를  쓰거나 벡테로 해야 합니다.

int a[n] = {0,};  이런 방식은 하면 안되는 방식입니다. 

dldldksl님의 프로필

dldldksl

질문자

2021.05.18

아하 답변 감사합니다!

줄곧 int a[n] = {0,};  이렇게 써왔는데, 이 방식이 왜 안되는건지 여쭤봐도 될까요??

(* 어떤 컴퓨터에서는 안된다거나,, 메모리 할당에 어떤 문제가 있다거나 하는 이유요..!!

그냥 궁금해서 여쭤봅니다!!!)

0

yeni님의 프로필

yeni

2022.12.22

안녕하세요! 저도 잘 알고있는게 아니라 조심스럽지만, 제가 알기로 할당을 할 때 코드를 읽는 순서가 오른쪽 <- 왼쪽이라고 알고 있습니다!
컴파일시 int a[n] = { 0, };으로 초기화 할 때 n을 알 수 없어서(n은 런타임에 들어오는 값이니) 생기는 문제같습니다. 선생님께서 말씀하신대로 new 연산자를 이용한 동적 할당이나 벡터를 이용해서 해결하면 될 것 같습니다!

혹은
int a[n];
a[인덱스] = 할당하고자하는 값;
으로 나누면 개별 값에 접근과 할당이 가능합니다.

초기화를 원할 경우
fill(a, a+n, 초기화 원하는 값)으로 할 수 있습니다!

dldldksl님께서 n을 입력받은 후 int a[n] = { 0, }이 가능했다고 하셨는데, n 값을 입력받는게 아니라 다른 함수에서 파라미터로 n을 넘겨받는 경우는 아니었을까 조심스럽게 예측해봅니다. (저도 비슷한 고민을 한 적이 있었어서요...!) 말씀하신 방식으로 실행이 되었던 코드가 있으시다면 더 자세히 알 수 있을 것 같아요!

(틀린 부분 있으면 수정 부탁드리겠습니다..!)