본문 바로가기

IT 공부/C언어

[C언어] 포인터와 메모리 간단 요점 정리

드디어 c언어의 그렇게도 어렵다는 포인터공부를 시작했다. 

 

int num1 =10; 와 같이 변수를 지정할때 이변수는 컴퓨터의 메모리에 생성이된다.

즉 메모리에 일정 공간을 확보하여 원하는 값을 가져오거나 저장하는 방식이다.

보통 변수는 변수 이름이 있지만 메모리의 특정 위치에 위치하고 있으므로 메모리 주소로도 표현할수있다.

메모리 주소를 구할때는 &변수처럼 변수앞에 &을 써주면 되고 printf("%p\n", &변수);

서식 지정자는 %p , 16진수의 %x 를 사용해도 된다.

다음과 같이 포인터 변수는 *를 사용하여 선언합니다(포인터 변수는 포인터로 줄여서 부르기도 합니다).

  • *자료형 포인터이름; 포인터 선언
  • 포인터변수 = &변수; ← 변수의 주소값을 넣을때
  • 이때 포인터변수에 *를 쓰지않는다. *포인터변수 = &변수; 는 자료형이 맞지않기때문에 컴파일 불가.
  • 주소값이 아닌 value를 넣게 될때는 *포인터변수 = 변수; 가 맞다.

int *numptr , &num1 → pointer to int, address of int

int num1 , *n umptr → int

void 포인터

기본적으로 C 언어는 자료형이 다른 포인터끼리 메모리 주소를 저장하면 컴파일 경고가 발생한다. 하지만 void 포인터는 자료형이 정해지지 않은 특성 때문에 어떤 자료형으로 된 포인터든 모두 저장할 수 있습니다. 반대로 다양한 자료형으로 된 포인터에도 void 포인터를 저장할 수도 있다. 이런 특성 때문에 void 포인터는 범용 포인터라고 한다.

포인터에는 malloc함수로 원하는 만큼 메모리를 할당할수 있다. <stdlib.h>에 포함되어있다.

malloc함수로 메모리를 할당하고→ 사용 → free함수로 해제 시키는 방식으로 사용이된다.

 

#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일

int main()
{
	int num1 = 10;
	int *numPtr1; 

  numPtr1 = &num1;

	int *numPtr2;

	numPtr2 = malloc(size of (int)); // int의 크기 4바이트만큼 동적 메모리 할당

	printf("%p\n", numPtr1);
	printf("%p\n", numPtr2);

	free(numPtr2); //동적으로 할당한 메모리 해제
	
	return(0);	
}

 

여기서 numPtr1에는 일반 변수의 메모리 주소를 할당했고, numPtr2에는 malloc 함수로 메모리를 할당했다. 같은 메모리 주소라도 내부적으로는 약간의 차이가 있다. 스택과 힙 두 가지인데 변수는 스택(stack)에 생성되며 malloc 함수는 힙(heap) 부분의 메모리를 사용한다

스택과 힙의 큰 차이점은 메모리 해제다. 스택에 생성된 변수는 사용한 뒤 따로 처리를 해주지 않아도 되지만 malloc 함수를 사용하여 힙에서 할당한 메모리는 반드시 해제를 해주어야 한다. 따라서 다음과 같이 free 함수로 메모리를 해제

memset 함수를 사용하면 메모리의 내용을 원하는 크기만큼 특정값으로 설정할 수 있다.

memset함수를 사용하기 위해서는 string.h 나 memory.h 헤더 파일을 사용하면된다,

  • memset(포인터, 설정할값, 크기);
  • void memset(void _Dst, int _Val, size_t _Size);
#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일
#include <string.h>    // memset 함수가 선언된 헤더 파일

int main()
{
    long long *numPtr = malloc(sizeof(long long));  // long long의 크기 8바이트만큼 동적 메모리 할당

    memset(numPtr, 0x27, 8);    // numPtr이 가리키는 메모리를 8바이트만큼 0x27로 설정

    printf("0x%llx\n", *numPtr);    // 0x2727272727272727: 27이 8개 들어가 있음

    free(numPtr);    // 동적으로 할당한 메모리 해제

    return 0;
}

 

개념을 머리에 익힐려고 계속보고는 있지만 조금 헷갈린다 더 열심히해야지