-
연속 vs 불연속 1프로그래밍 언어 C, C++ 2021. 1. 4. 21:52728x90
정의 vs 선언1 에서 선언은 할당을 포함한다고 언급했다(할당=메모리확보)
링크 참조 jamesbbun.tistory.com/15
선언을 한다는건 또 다른 아주 중요한 의미를 하나 더 가지고 있다.
한번의 선언에서 확보한 하나의 메모리는 메모리내에서는 주소가 연속적이다.
이 점이 메모리를 직접 접근하지 못하는 고급 언어와는 다른 점이자, 특별함이자 장점이다.
12345678910111213#include <stdio.h>#include <string.h>void main(){int a[8] = {0, 1, 2, 3, 4, 5, 6, 7};int b[4][2] = { {7, 6}, {5, 4}, {3, 2}, {1, 0} };memcpy(a, b, sizeof(int)*8);// memcpy(b, a, sizeof(int)*8); 당연히 역도 성립for(int i=0; i<8; i++)printf("a[%d] = %d\n", i, a[i]);}cs 고급 언어로만 개발해온 사람 입장에서는 이 코드가 이해가 잘 안될 뿐더러, 골치도 살짝 아플것이다.
배열의 차수가 다른데도 컴파일 에러가 발생하지 않고,
a[0] = 7, a[1] = 6, a[7] = 0 으로 정상적으로 출력까지 된다.
C/C++에서는 배열을 선언하는 순간, 즉
int a[8], int b[4][2] 둘다 int자료형 8개가 연결되어 있는 스택 메모리를 각각 가지기 때문에 이 결과가 가능해진다.
배열의 차수의 문법적인 부분보다 내부 메모리 구조상으로 이해해야 한다.
이럴 보통 메모리가 연속적이다 라는 표현을 쓴다고 생각하면 편하다.
예를 하나 더 보자.
1234567891011121314#include <stdio.h>#include <string.h>void main(){int a[8] = {0, 1, 2, 3, 4, 5, 6, 7};int b[4][2] = { {7, 6}, {5, 4}, {3, 2}, {1, 0} };memcpy(a, b, sizeof(int)*8);// memcpy(b, a, sizeof(int)*8); 당연히 역도 성립int* c = (int*)b;for(int i=0; i<8; i++)printf("c[%d] = %d\n", i, c[i]);}cs b의 주소값을 c가 참조해서 바로 사용할 수도 있는 경우이다.
b가 int 8개를 연속적으로 가지고 있기 때문에 단일 주소값을 가지는 c포인터가 그 주소를 가지는것이 성립 되는것이다.
방금까지 정적할당을 살펴보았는데, 이번에는 정적할당을 살펴보자.
동적 할당으로 4x2 를 만드는 과정이 좀 복잡해보인다. 복잡할뿐 어려운건 없다.
중요한건 int* b = (int*)a; 이부분만 자세히 보자.
1234567891011121314151617181920212223#include <stdio.h>#include <string.h>#include <stdlib.h>void main(){int i, j;//int a[4][2] = { {0, 1}, {2, 3}, {4, 5}, {6, 7} };//동적 할당으로 위의 값처럼 대입int** a = (int**)malloc(sizeof(int*)*4);for(i=0; i<4; i++){a[i] = (int*)malloc(sizeof(int)*2);for(j=0; j<2; j++)a[i][j] = 2 * i + j;}int* b = (int*)a;for(i=0; i<8; i++)printf("b[%d] = %d\n", i, b[i]);}cs 컴파일해보면 에러가 난다. 위의 예제랑 특별히 달라보이지 않는데 말이다.
모든 비밀은 선언하는 횟수와 연관이 있다는 말이다.
a를 구성하는데 5번의 malloc함수를 부른다. 한번의 malloc으로 확보한 메모리내에는 연속적이지만,
malloc간의 메모리는 불연속적이기 때문에,
int* b = (int*)a 가 성립할수 없는것이다.
어떻게든 컴파일 에러는 막을수야 있겠지만, 런타임 에러는 피할수 없을것이다.
기본적인 내용은 여기까지 하고,
다음 글에서 더 이어가자.
'프로그래밍 언어 C, C++' 카테고리의 다른 글
프로그래머 워밍업 2 (0) 2021.01.09 프로그래머 워밍업 1 (0) 2021.01.07 개발자, 무엇을 준비 할까? (0) 2021.01.04 Visual Studio 2019 셋팅 (0) 2021.01.04 연속 vs 불연속 2 (0) 2021.01.04