작성
·
1.2K
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
0
안녕하세요! 저도 잘 알고있는게 아니라 조심스럽지만, 제가 알기로 할당을 할 때 코드를 읽는 순서가 오른쪽 <- 왼쪽이라고 알고 있습니다!
컴파일시 int a[n] = { 0, };으로 초기화 할 때 n을 알 수 없어서(n은 런타임에 들어오는 값이니) 생기는 문제같습니다. 선생님께서 말씀하신대로 new 연산자를 이용한 동적 할당이나 벡터를 이용해서 해결하면 될 것 같습니다!
혹은 int a[n];
으로 나누면 개별 값에 접근과 할당이 가능합니다.
a[인덱스] = 할당하고자하는 값;
초기화를 원할 경우fill(a, a+n, 초기화 원하는 값)
으로 할 수 있습니다!
dldldksl님께서 n을 입력받은 후 int a[n] = { 0, }이 가능했다고 하셨는데, n 값을 입력받는게 아니라 다른 함수에서 파라미터로 n을 넘겨받는 경우는 아니었을까 조심스럽게 예측해봅니다. (저도 비슷한 고민을 한 적이 있었어서요...!) 말씀하신 방식으로 실행이 되었던 코드가 있으시다면 더 자세히 알 수 있을 것 같아요!
(틀린 부분 있으면 수정 부탁드리겠습니다..!)
아하 답변 감사합니다!
줄곧 int a[n] = {0,}; 이렇게 써왔는데, 이 방식이 왜 안되는건지 여쭤봐도 될까요??
(* 어떤 컴퓨터에서는 안된다거나,, 메모리 할당에 어떤 문제가 있다거나 하는 이유요..!!
그냥 궁금해서 여쭤봅니다!!!)