22년 3월 16일(2) - array
#include <iostream>
int main()
{
//엄청나게 많은 변수를 만들어야 할 때 배열을 사용한다.
/*
배열: 같은 타입의 변수 여러개를 한 번에 선언할 수 있는 기능.
배열은 연속된 메모리 공간에 만들어진다.
즉, 하나의 큰 메모리 공간을 할당하고 그 공간을 개수만큼 쪼개서 사용하게 된다.
개별 변수를 만들 때는 지금 당장 만들수 있는 빈 메모리에 공간을 할당하여 변수를 저장.
하지만 배열로 한 번에 여러 변수를 만들 떄는 한번에 선언한 만큼의 공간을 이어서 할당한다.
*선언 방법
int Array[n];
*/
/*
배열의 갯수를 10억개 이상을 할당하면 에러가 남.
배열의 최대 길이는 한계가 있다.
배열의 전체 크기는 0x7fffffff바이트를 초과할 수 없습니다.
0x7fffffff = 2,147,483,647 = INT_MAX와 동일한 수치
32비트(x86)의 최대값
최대 할당할 수 있는 배열의 길이가 0xffffffff의 절반인 0x7fffffff인 이유
32비트에서는 최대 4기가까지 메모리 관리가 가능.
0xffffffff = 4기가 --> 최대 관리 가능한 메모리가 4기가인데 배열로 4기가를 할당할 경우
운영체제를 돌릴 메모리가 남지 않는다 --> 운영체제를 제어할 최소한의 메모리만 남겨놓기 위해 0x7fffffff(2gb)까지만 할당이 가능하게 해 놓음.
*/
/*
int Count = 100;
int Array[Count]; << 에러 발생. 배열은 변수로 만들 수 없다.
안되는 이유: 함수 호출 규약
진입하는 그 순간 스택이라는 공간에다가 쓸 메모리 공간을 계산하여 할당한다.
그런데 배열을 변수로 할당하게 되면 메모리 공간을 계산할 수가 없기 때문에 불가능하게 만든 것.
*/
int Array[100];
//배열의 각 요소에 접근하기 위해서 인덱스를 제공한다.
//인덱스는 0부터 개수 -1까지 존재한다.
Array[79] = 3030;
std::cout << Array[79] << std::endl;
std::cout << Array[100] << std::endl;
//배열의 오버플로우: 배열의 최대 공간 이상으로 접근은 가능하지만, 이 공간은 다른 프로그램 같은데서 사용하고 있는 값일수도 있다. --> 에러 발생의 원인이 되므로 주의.
//배열을 선언하고 값을 따로 할당하지 않으면 쓰레기값이 저장됨.
//이 쓰레기값이 에러를 발생시킬 수 있으므로 값의 초기화가 필요하다.
int Array2[100] = {}; //{}을 넣어주면 배열이 전체 0으로 초기화가 된다.
//for문과 같이 써보기
for (int i = 0; i < 100; ++i)
{
Array[i] = i + 1;
}
return 0;
}