배열과 포인터 표기법
즉, data[n] 과 *(data+n)은 같다
서로 다른 데이터라 가정했을때 결국 표기법만 다를뿐 의미는 같다 (단, 혼용해서 사용하지않도록 유의)
베열 변수의 이름은 배열의 시작주소 (이해 과정)
& 앰퍼샌드 (주소를 얻겠다는 의미) , * 포인터 (data가 가르키는 메모리) &(*data) = data 같은의미로 생략가능
메모리 할당
프로그램 - 프로그래머가 만든 프로그램 실행파일
프로세스 - CPU가 실행파일에 있는 명령들을 실행할수있도록 운영체제가 실행파일의 명령들을 읽어서 메모리의 재구성한 것
' 실행프로그램 ' 이라고도 함 , 세그먼트 집합으로 구성
세그먼트 - 여러가지 정보나 사용자가 입력한 데이터를 기억하는 메모리 공간 (코드,데이터,스택)
코드 세그먼트 - 실행파일이 실행되어 프로세스가 만들어졌을때 기계어 명령들이 저장되는 곳
데이터 세그먼트 - 프로그램이 시작해서 끝날때까지 사용되는 데이터가 보관되는 곳
스택 세그먼트 - 프로그램 실행중에 필요한 임시데이터를 저장하는데 사용하는 메모리 영역
정적 메모리 할당
- 컴파일러가 소스코드를 기계어로 번역하는 시점에 변수에 크기에 맞게 메모리를 할당하는 것
- 프로그램이 실행될때 메모리의 위치가 결정됨
- 프로그램 실행중에 할당된 메모리의 크기는 변경이 불가
정적으로 할당된 메모리를 관리하는 법
- 지역 변수를 사용하려면 그 변수의 현재주소를 알아야 한다
- 각 지역변수의 현재 주소를 기억하려면 지역변수의 개수만큼 메모리가 더 필요하다
- 같은함수에 선언한 지역변수들을 하나의 메모리 그룹으로 관리 가능
- 지역변수를 시작위치(start) 포인터와 끝 위치(end) 포인터를 사용하여 관리 가능
스택
- 스택은 자료구조의 한 종류
- 두개의 포인터로 많은 양의 데이터를 효과적으로 관리하는 이론
- 베이스 포인터 (Base pointer,BP)를 기준으로 데이터를 추가할때마다 순서대로 데이터를 쌓아올림
- 스택 포인터(Stack pointer,SP)로 새로운 데이터가 추가될 위치를 가르킴
이론적 (자료구조) 으로는 push 는 스택포인터 주소 증가가 맞지만, 반대로 실제로 컴퓨터 시스템안에서는 반대로 적용됨
스택 메모리도 간접 주소지정 방식(포인터) 개념을 이용하여 값을 읽거나 저장할수있다.
동적 메모리 할당
- 원하는시점에 원하는 크기만큼 힙(heap)에 메모리 할당 가능
- 메모리 사용이 끝나면 언제든지 할당한 메모리 해제 가능
- giga byte 단위까지 할당가능
free 함수로 할당된 메모리 해제하기
- 힙(heap)에 할당된 메모리는 프로그램이 끝날때까지 자동 해제되지않음
- free 함수를 이용하여 명시적으로 메모리 해제
- malloc, free 함수가 선언된 malloc.h 파일을 포함해야함
free(p); // p가 가지고있는 주소에 할당된 메모리를 해제
메모리 할당 함수를 사용하는 경우에는 반드시 free 를 사용하여 메모리를 해제 해주어야함
(메모리 할당이 계속 누적되어 주소를 잃어버리면 메모리 손실 발생)
메모리 할당부분에서는 어느정도 설명을 들으면 이해가 되는편이긴 하지만 포인터부분은 진짜 많이 반복해서 들어야 할 것 같다 ㅠㅠ
다른언어를 배워보진 않았지만 c언어.. 정말 만만치 않다 너무 어렵게 느껴진다.. ㅠㅠ

C언어는 훑고 가자는 마음으로 듣고있었지만 내가 생각보다는 많이 개념을 이해하려고 노력한거 같다. 아직 많이 부족하긴 하지만 나중에 필요할때 쉽게 공부할수있을거 같다 !
'C 언어' 카테고리의 다른 글
아무것도 모르는 코딩 배우기 6일차 (C언어 2차원 배열, 포인터) (0) | 2022.11.11 |
---|---|
아무것도 모르는 코딩 배우기 5일차 (C언어 사용자 정의 함수, 배열) (0) | 2022.11.07 |
아무것도 모르는 코딩 배우기 4일차 (C언어 IO, scanf) (0) | 2022.11.03 |
아무것도 모르는 코딩 배우기 3일차 (C언어 for문(반복문)) (0) | 2022.11.02 |
아무것도 모르는 코딩 배우기 2일차 (C언어 기초) (0) | 2022.11.02 |