본문 바로가기
자바 Java

자료구조를 배우기 전의 C언어 기초 문법 (메모리/ 배열)

by MEHAVING 2019. 10. 9.
반응형

RAM

컴퓨터의 메모리: 데이터를 보관하는 장소

바이트 8 bits 단위로 주소가 지정됨

모든 변수는 주소를 가진다

 

포인터

메모리 주소를 값으로 가지는 변수

 

포인터 변수 선언 방식

type-name * variable-name;

ex) int * ptr; : 정수형 포인터 변수 ptr

ptr이 포인터 변수라서 메모리 주소를 저장을 하는데, 그 주소에 저장된 데이터 타입이 int형 변수이다.

 

연산자 &

변수로부터 그 변수의 주소를 추출하는 연산자

이해를 돕는 자료

이게 어마무시하게 헷갈렸던 부분

y = *ip

*ip는 포인터변수 ip가 가리키는 주소가 가지고 있는 값

그냥 ip는 ip의 값인 int형 주소값

 

 

포인터와 배열은 매우 긴밀히 연관되어 있다

 

배열a는 포인터 변수와 같이 주소값을 이야기하지만 일반 포인터변수처럼 값을 수정할 수는 없다.

 

 

int num[10]; 이면

매개변수를 *num나 num[0]나 num으로 받든 도찐개찐이라는 것

 

또 헷갈렸던 부분

num[1]은 *(num+1)과 동일 : C에서 포인터변수 + 1은 주소값에 1을 더하는게 아니라 int형이면 4바이트, double이면 8바이트 처럼 자료형의 크기만큼 증가하는 기능을 제공

즉, num[i] 는 *(num+i)와 동일하다는 것

 

동적 메모리 할당 dynamic memory allocation

 

프로그램이 실행되는 중에 필요할 때 필요한만큼 메모리를 운영체제로부터 저장공간을 할당받아서 사용하고 사용이 끝나 메모리가 필요 없을 때 저장공간을 해제해 시스템에 메모리를 반납하는 것

 

변수를 선언해서 데이터를 메모리에 저장하는 것보다

자유롭게 malloc으로 직접 메모리를 할당할 수 있다

=> 더 유연하고 효율적이게 메모리를 사용하고 관리 가능

 

 

전역변수와 지역변수로 해결이 되지 않는 상황

생성과 소멸의 시기가 지역변수나 전역변수와 다른 유형의 변수 malloc과 free

함수가 매번 호출될 때마다 새롭게 할당되고 또 함수를 빠져나가도 유지가 되는 유형의 변수

 

동적메모리가 할당되는 공간: 히프(heap) / 운영체제가 사용되지 않는 메모리 공간을 모아 놓은 곳

 

    int *p;
    p = (int *)malloc(sizeof(int)); //위에서 p의 자료형이 int형 *이므로 반환형이 void *인 malloc() 함수의 p도 형변환 해주어야 함
    *p = 1000; // p가 가르키는 장소에 1000 저장
    free(p); //동적 메모리 반납

- malloc()함수 : size바이트 만큼의 메모리 블록을 할당, 동적 메모리 블럭의 시작 주소를 반환

- 동적메모리는 포인터로만 사용할 수 있음

- free()함수 : 할당된 메모리 블록을 운영체제에게 반환, 해제

 

 

** malloc()은 시스템의 메모리가 부족해서 요구된 메모리를 할당할 수 없으면 NULL을 반환한다. 따라서 malloc()의 반환값은 항상 NULL인지 검사하여야 한다.

 

 

 

 

 

malloc 함수 호출

- malloc은 메모리 주소를 변수에 저장해서 보관을 해야하니 당연히 그 주소는 *p인 포인터변수 p에 저장

 

- malloc(개수*sizeof(자료형))이 일반적인 형태

 

- 만약 malloc을 사용하지 않고 array로 메모리를 할당해주었다면 추후 array의 크기를 malloc을 사용한 tmp를 활용해 수정했을 때 오류가 뜬다

array는 값의 수정이 불가능하니까 !

 

 

반응형

'자바 Java' 카테고리의 다른 글

추상클래스 추상메서드  (0) 2019.10.16
문자열  (0) 2019.10.09
선행처리  (0) 2019.10.06
다중 포인터  (0) 2019.10.06
배열 / 다차원 배열 ( 2차원 배열 / 3차원 배열 )  (0) 2019.10.05

댓글