Java 메모리 할당
Java의 배열은 Stack 영역에 만들 수 없다.
// new 연산자는 heap 영역에 데이터를 동적할당 한다는 의미
int[] arr = new int[50];
new Integer(1)
Java
복사
int a; // 4
int b; // 4
// dock 객체는 20 바이트라고 가정
Dock dock = new WhiteDock(); // 8
// stack 에 16, heap 에 20 바이트 할당
Java
복사
C언어 메모리 할당
int a; // 4
int b; // 4
int arr[10]; // 8 + 40
// stack에 56 바이트 할당
C
복사
int a; //4
int b; //4
int* arr = malloc(sizeif(int)*10); // 8
// stack 에 16, heap에 40 바이트 할당
C
복사
정적할당과 동적할당
•
정적할당
런타임 중 사이즈 변경 불가능
메모리 자동 할당, 반납
•
동적할당
런타임 중 사이즈 변경 가능
메모리 수동 할당, 반납
ArrayList는 어떻게 무한히 데이터를 받을 수 있을까?
내부적으로 크기가 두배인 배열을 생성해 기존 값을 붙여넣고 참조를 변경한다.
1차원 char 배열에 문자열 넣기
#define NAMES_COUNT 10 // 이름이 10개 들어가야 한다는 뜻
#define NAMES_SIZE 200 // names 배열의 크기가 총 200바이트 라는 뜻
int main(void) {
char names[NAMES_SIZE];
int len = NAMES_SIZE/NAMES_COUNT;
for(int i =0;i<NAMES_SIZE;i+=len){
printf("%d번째 사람 이름을 입력해주세요 : ",i/len+1);
scanf("%s", names+i);
}
for(int i =0;i<NAMES_SIZE;i+=len){
printf("%d 번째 사람 이름 : %s\n",i/len+1,names+i);
}
return 0;
}
// names (1번째사람이름, 2번째 사람이름 을 입력했을 때)
// 1, 번, 째, 사, 람, 이, 름, \0,..., 2, 번, 째, 사, 람, 이, 름, \0,
// names^ (names+20)^
C
복사
2차원 char 배열에 문자열 넣기
int main(void) {
char names[NAMES_COUNT][20];
for ( int i = 0; i < NAMES_COUNT; i++ ) {
printf("%d번째 사람의 이름을 입력해주세요 : ", i + 1);
scanf("%s", *(names+i));
}
for ( int i = 0; i < NAMES_COUNT; i++ ) {
printf("%d번째 사람의 이름 : %s\n", i + 1, *(names+i));
}
return 0;
}
C
복사
1차원 배열과 2차원 배열의 비교
char one[200] ; 1차원 배열의 경우, one+i*20 는 one[i * 20]의 주소값을 의미하고
char two[10][20]; 2차원 배열의 경우, *(two+i) 는 two[i][0]의 주소값을 의미한다.
일다원이든 다차원이든 할당되는 메모리 구조는 다르지 않지만 다차원 배열은 더 편리하게 사용할 수 있는 문법이다.