본문 바로가기
Algorithm/유용한 팁 (Tips)

[C,C++] 1,2차원 배열 원소 선언, 정적 동적 전체 초기화

by matters_ 2018. 8. 23.

문제를 풀다 C와 C++의 1,2차원 배열 선언 초기화가 동적,정적에 따라서도 완전달라 포스팅을 해보려 한다. 

 


C 1차원 배열 정적,동적 초기화

C 2차원 배열 정적,동적 초기화

C++ 1차원 배열 정적,동적 초기화

C++ 2차원 배열 정적,동적 초기화

 

순으로 진행된다.

 

 

먼저 C 1차원 배열 정적 초기화의 경우 일반적인 배열 초기화는 다들 알걸로 생각한다.


1
2
3
4
5
6
7
//int형의 5개 배열을 초기화
 
int arr[5]={5,9,3,4,2};
 
//개수를 생략해도 무방하다.
 
int arr[]={5,9,3,4,2};
cs

 

1
int arr[5]={6,} 
cs

이렇게 하면 모두 6으로 초기화 된다는 포스팅이 많은데 그렇지 않다. 

6 0 0 0 0이렇게 될뿐이다. 

한번에 초기화하는 법은 찾아서 업데이트 하겠다...

 

 

 

배열원소를 외부에서 받아오는 동적 초기화 경우이다.


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int num;
 
scanf("%d",&num);
 
///선언의 3가지 방식
 
//함수를 쓰지않고 바로 선언
 
int numarr[num];    
 
 
//malloc함수를 사용해서 선언, #include <stdlib.h>필요
 
int *numarr;
 
numarr= (int *mallocsizeof(int*)*num );// 메모리 할당, 배열의 크기만큼 할당하기 위해 5를 곱한다.
 
free(numarr);   //  항상 해제를 해주자 
 
 
//calloc함수를 사용해 선언, #include <stdlib.h>필요
 
numarr= (int*calloc(5sizeof(int));    // sizeof(int)크기의 변수를 5개 저장할 수 있는 공간할당 
 
free(numarr);  // 항상 해제를 해주자 
//여기서 malloc과 calloc의 차이점은 malloc은 할당된 공간에 쓰레기값이 들어가지만
 calloc은 모두 0으로 초기화 시켜준다는 차이점이 있다.
cs

 

이렇게 외부에서 숫자를 받아 1차원 배열 초기화를 할 수 있으며 

 

 

1
2
3
4
5
for(int i=0;i<num;i++){
 
    scanf("%d",&numarr[i]);
 
}
cs

 

 

한꺼번에  calloc을 써서 동적 배열 원소를 모두 0으로 초기화 시킬 수 있다.

다른 숫자로 초기화는 아직 필자가 보지 못했다 아시는분 있으면 제보 부탁한다.

 

C 2차원 배열 정적 초기화


1
2
3
4
5
6
7
//int형의 3*5개 배열을 초기화
 
int arr[5][3]={{5,9,3}
{5,9,3}
{5,9,3}
{5,9,3}
{5,9,3}};
cs

 

배열원소를 외부에서 받아오는 동적 초기화 경우이다.


1
2
3
4
5
6
7
8
9
10
11
//malloc함수를 사용해서 선언, #include <stdlib.h>필요
 
int **temp=NULL;
 
temp = (int **mallocsizeof(int)*num );
 
forint i=0; i<num; i++) {
 
     temp[i] = (int *mallocsizeof(int)*num );
}
//free는 반대순로 해주면 된다.
cs

 

 

 
1
2
3
4
5
6
7
8
9
10
11
//calloc함수를 사용해 선언, #include <stdlib.h>필요
int **temp=NULL;
 
temp = (int**calloc(num, sizeof(int));    // sizeof(int)크기의 변수를 5개 저장할 수 있는 공간할당 
 
forint i=0; i<num; i++) {
 
     temp[i] = (int *calloc(num, sizeof(int));
 
}
//free는 반대순로 해주면 된다
cs

 

 

 

마찬가지로 외부에서 숫자를 받아 1차원 배열 초기화를 할 수 있으며 

 

 

1
2
3
4
5
6
7
8
for(int i=0;i<num;i++){
 
    for(int j=0;j<num;j++{
 
        scanf("%d",&temp[i][j]);
    }
 
}
cs

 

 

한꺼번에  calloc을 써서 동적 배열 원소를 모두 0으로 초기화 시킬 수 있다.

다른숫자 초기화는 제보 부탁드립니다

 

 

C++ 1차원 배열 정적 초기화


1
int arr[5]={6,}
cs

위와 같은 방법은 C++에서도 통하지 않는다. 첫번째만 6로 초기화되고 쓰레기값이 들어가거나 0으로 초기화되는 식이다.

 

 

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using namespace std;
 
int main() {
    int arr[5= { 6, };
    for (int i = 0; i < 5; i++) {
        cout << arr[i] << endl;
 
        }
    return 0;
}
cs

 

 

 

 

그럼 어떻게 초기화 하냐? 다행이 함수가 있다.

 

1
std::fill_n(arr, 56);
cs

 

위의 함수를 사용하면  arr의  5개 원소에 대해 6 6 6 6 6으로 초기화가 된다.

 

C++ 1차원 배열 동적 초기화


1
2
bool arr[MAXNUM];
std::fill_n(arr, MAXNUM, 1);
cs

 

동적에서도 가능하다. 

 

C++ 2차원 배열 정적 초기화


memset()함수를 이용해 초기화 할 수 있다.

 

1
2
3
4
5
//#include<string.h>를 포함해야 한다.
int arr[10][10];
for(int i=0; i<10; i++){
memset(arr[i], 0sizeof(int)*10); //모든 값 0으로 초기화
}
cs
 

여기서 주의 할 점 0,-1 대신 다른값은 초기화가 안된다. 예를 들어 6을 넣으면 6이 아닌 다른 숫자로 초기화된다. 

바이트단위로 초기화 하기 때문이다.

 

 

 

C++ 2차원 배열 동적 초기화


 

 

정적초기화를 변형하여 적용하면 된다.

 

(참고) 모든 동적초기화는 C99표준 이상에서만 적용된다.

 

 

 

 

여기까지 포스팅하다 문득 든 생각은 배열 말고도 다른 STL EX. vector등 많은 우수한 템플릿이 있다는 것이다

굳이 배열을 써야하나를 느꼈다.ㅎ 참고만하자.. 

 

 

댓글