cheoly's language study blog

C언어 포인터, 동적할당, 메모리 관리

프로그래밍/C언어
반응형
SMALL

오늘은 C언어 포인터에 대해 알아보겠습니다. 포인터란 무엇일까요? 포인터는 메모리의 주소를 저장하는 변수로, 메모리 관리를 효율적으로 할 수 있게 도와줍니다. 특히, 동적 메모리 할당을 통해 프로그램의 메모리 사용을 최적화할 수 있습니다.

 

C언어 포인터의 개념

C언어에서 포인터는 변수의 주소를 가리키는 변수입니다. 포인터를 사용하면 메모리의 특정 위치에 직접 접근할 수 있어, 데이터 구조를 효율적으로 관리할 수 있습니다. 포인터는 메모리의 주소를 저장하므로, 메모리의 내용을 직접 수정하거나 읽을 수 있는 강력한 도구입니다.


메모리 관리의 중요성

메모리 관리는 프로그램의 성능과 안정성에 큰 영향을 미칩니다. 메모리를 효율적으로 관리하지 않으면, 프로그램이 비정상적으로 종료되거나, 메모리 누수와 같은 문제가 발생할 수 있습니다. 따라서, C언어에서는 malloc과 free 함수를 사용하여 동적 메모리를 할당하고 해제하는 것이 중요합니다.


malloc 함수의 사용법

malloc 함수는 메모리를 동적으로 할당하는 데 사용됩니다. 이 함수는 요청한 크기만큼의 메모리를 할당하고, 그 시작 주소를 반환합니다. 예를 들어, 다음과 같은 코드로 메모리를 할당할 수 있습니다.


int *arr;
arr = (int *)malloc(sizeof(int) * N);

위 코드에서 N은 배열의 크기를 나타내며, malloc 함수는 N개의 정수를 저장할 수 있는 메모리를 할당합니다. 메모리 할당이 성공하면, arr 포인터는 할당된 메모리의 시작 주소를 가리키게 됩니다.

 

free 함수의 사용법

할당한 메모리는 사용이 끝난 후 반드시 해제해야 합니다. 이를 위해 free 함수를 사용합니다. free 함수는 포인터가 가리키는 메모리를 해제하고, 해당 메모리를 다시 사용할 수 있도록 합니다. 예를 들어, 다음과 같이 사용할 수 있습니다.

c
free(arr);
arr = NULL; // 포인터를 NULL로 초기화

이렇게 하면 메모리 해제가 완료되고, 포인터를 NULL로 초기화하여 잘못된 메모리 접근을 방지할 수 있습니다.

메모리 해제를 하지 않았을 때의 문제
메모리 해제를 하지 않으면 메모리 누수가 발생할 수 있습니다. 메모리 누수란, 프로그램이 사용한 메모리를 해제하지 않아 점점 메모리가 부족해지는 현상입니다. 이로 인해 프로그램이 느려지거나, 심지어 시스템이 다운될 수도 있습니다.

 

메모리 누수 방지 방법

메모리 누수를 방지하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.

동적 메모리 할당 후 즉시 해제하기
메모리 해제를 잊지 않기
메모리 사용이 끝난 후 포인터를 NULL로 초기화하기
이러한 방법을 통해 메모리 누수를 예방할 수 있습니다.

실제 코드 예제
아래는 학생의 점수를 입력받아 평균을 계산하는 간단한 프로그램입니다. 이 프로그램에서는 동적 메모리를 사용하여 점수를 저장합니다.

c
#include <stdio.h>
int main()

위 코드는 학생 수를 입력받고, 각 학생의 점수를 입력받아 총 점수와 평균 점수를 출력합니다.

 

마무리 및 추가 자료


C언어에서 포인터와 메모리 관리는 매우 중요한 개념입니다. malloc과 free를 적절히 사용하여 메모리를 관리하면, 프로그램의 성능을 높이고 안정성을 유지할 수 있습니다. 더 자세한 내용은 아래의 링크를 참고해 보세요.
https://dafher-diary.tistory.com/16

 

POCU C언어 정주행 14회차 - malloc과 free, 메모리 함수, 메모리 관리 기법

1. malloc과 free 이번 글은 강의에서 동적 할당에 대해 다룬 것들 중에서 내가 몰랐던 것들을 위주로 적어보려고 한다. 따라서 malloc, calloc, free함수의 사용법이나 어떤 역할을 하는지에 대한 내용은

dafher-diary.tistory.com

https://nunbu.tistory.com/157

 

[C언어] C언어 개발시 메모리 누수 오류의 원인과 방지 방법

[C언어] C언어 개발시 메모리 누수 오류의 원인과 방지 방법 C언어로 리눅스 코어뱅킹 은행 시스템을 개발하다 보면 메모리 누수 오류는 흔하게 발생하는 문제 중 하나입니다. 메모리 누수 오류

nunbu.tistory.com

 

https://velog.io/@mjung/%EB%8F%99%EC%A0%81-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%A0%EB%8B%B9malloc%EA%B3%BC-%ED%95%A0%EB%8B%B9%ED%95%B4%EC%A0%9Cfree-%EC%A0%95%EB%A6%AC

 

동적 메모리 할당(malloc)과 할당해제(free) 정리

ft_lstdelone 함수 main 부분을 짜던 중 자꾸 버그가 난다.해결을 위해 이것저것 만져보던 도중, 지금 직면한 문제와 시도하는 방법들이 정확히 모른 채 고치기에만 급급해 있다는 것을 느꼈다.현재

velog.io

 

이제 C언어의 포인터와 메모리 관리에 대해 좀 더 이해가 깊어지셨길 바랍니다. 포인터를 잘 활용하여 효율적인 프로그래밍을 해보세요!

반응형
LIST

C언어 구조체란?

프로그래밍/C언어
반응형
SMALL

이번 포스팅에서는 C언어의 구조체에 대해 자세히 알아보려고 해요. 구조체는 여러 자료형을 하나로 묶어 사용할 수 있는 강력한 도구인데요, 이를 통해 데이터의 관리와 조작이 훨씬 수월해진답니다. 그럼 하나씩 살펴볼까요?

C언어 구조체란?
구조체는 여러 개의 서로 다른 자료형을 하나의 단위로 묶어서 사용할 수 있도록 정의한 사용자 정의 자료형이에요. 예를 들어, 학생의 정보를 저장할 때 이름, 나이, 성별, 학번 등을 각각의 변수로 저장하는 대신, 구조체를 사용하면 이 모든 정보를 하나의 구조체로 묶을 수 있어요.

구조체의 정의 및 사용법
구조체를 정의할 때는 struct 키워드를 사용해요. 다음은 구조체를 정의하는 기본적인 방법이에요:

c
struct Student

이렇게 정의한 후, 구조체 변수를 인자로 넘겨주면 해당 학생의 정보를 출력할 수 있어요.

구조체 포인터
구조체 포인터를 사용하면 메모리 효율성을 높일 수 있어요. 구조체의 주소를 저장하고, 이를 통해 구조체의 멤버에 접근할 수 있답니다. 예를 들어:

c
struct Student *ptr = &student1;
printf("Name: %s\n", ptr->name);

위와 같이 -> 연산자를 사용하면 포인터를 통해 구조체의 멤버에 접근할 수 있어요.

구조체의 장점과 단점
구조체의 가장 큰 장점은 관련된 데이터를 하나의 단위로 묶어 관리할 수 있다는 점이에요. 이를 통해 코드의 가독성이 높아지고, 데이터 관리가 용이해져요. 하지만 단점으로는 구조체의 크기가 커질 수 있고, 복사할 때 성능 저하가 발생할 수 있다는 점이 있어요.

마무리 및 추가 자료
C언어의 구조체는 데이터 관리를 효율적으로 할 수 있는 강력한 도구예요. 다양한 자료형을 묶어 사용할 수 있어 프로그래밍의 유연성을 높여준답니다. 더 많은 예제와 자료는 아래 링크에서 확인해보세요!

 

https://blog.naver.com/highkrs/220184227321

 

[C언어 강의29] 구조체 사용법 (struct)

안녕하세요. 모프 입니다.   오늘은 C언어의 구조체에 대하여 설명해보도록 하겠습니다.  ...

blog.naver.com

https://studyc.tistory.com/23

 

초보자를 위한 기초 C 언어 강좌 #19 : 구조체

본 강좌는 아래 동영상 강좌와 같이 진행됩니다. 되도록이면 동영상과 같이 보시는 것을 추천합니다. 유튜브 채널 가기 강좌 19편 동영상 보기 이번시간에는 여러 자료형을 묶어 하나로 사용할

studyc.tistory.com

https://coding-factory.tistory.com/639

 

[C언어/C++] 구조체 사용법 & 예제 총정리

구조체란? 구조체란 하나 이상의 변수를 묶어 그룹화하는 사용자 정의 자료형입니다. 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입이며 기본 타입만으로는 나

coding-factory.tistory.com

 

반응형
LIST

포인터와 배열의 관계: C언어 초보자를 위한 이해와 활용

프로그래밍/C언어
반응형
SMALL

포인터와 배열은 매우 긴밀한 관계를 맺고 있으며, 어떤 부분에서는 서로를 대체할 수도 있습니다. 배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같습니다. 따라서 배열의 이름은 포인터 상수 (constant pointer)입니다.

간단히 설명하자면 둘다 비슷한 속성을 가지고 있지만 배열은 메모리공간을 사용자 마음대로 접근하며 데이터를 넣고 수정할 수 있다. 포인터 같은 경우에는 특정 메모리에 주소값을 가지고 있어서 간접참조를 하는 방식이다.

포인터와 배열의 차이점


배열은 변수 선언과 함께 자신의 데이터를 저장할 공간을 배열의 크기만큼 연속적인 공간을 가집니다. 포인터는 자신이 데이터를 저장할 공간을 가지지 않고 저장할 공간이 있는 위치를 저장하는 메모리 번지를 저장합니다.

배열은 그 자체가 크기 때문에 함수의 인수로 전달할 수 없지만 포인터는 대상체가 무엇이든간에 4바이트의 크기밖에 차지하지 않으므로 함수로 전달할 수 있습니다. 그래서 배열을 함수로 전달할 때는 반드시 포인터를 사용해야 합니다.

포인터와 배열의 사용 이유


일반적으로 포인터를 사용하는 목적은 동적으로 메모리를 할당하여 사용하기 위해서 사용합니다. 그리고 메모리가 할당된 후에는 배열처럼 사용하면 된다고 이전에 설명하였습니다.

배열은 변수들을 메모리상에 일렬로 나열해놓은 것과 마찬가지입니다. 배열도 메모리상에 존재하므로 엄연히 주소값이 존재합니다. 배열 포인터란 이 주소값을 가리키는 포인터를 말합니다. 이것이 유용한 이유는 바로 2차원 이상의 배열을 가리킬 때 포인터를 통해 배열과 같은 인덱싱을 할 수 있기 때문입니다. 함수에 2차원 이상의 배열을 파라미터로 던질 때 유용하게 사용됩니다.

배열과 포인터의 관계


배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같습니다. 따라서 배열의 이름은 포인터 상수 (constant pointer)입니다.

배열 포인터는 배열의 주소값을 저장하고 인덱싱할 수 있는 포인터를 말합니다. 배열 이름은 1차원 배열에서는 포인터와 같지만, 2차원 이상의 배열에서는 포인터의 역할을 하지 않습니다.

예제


#include <stdio.h>

int main(void) {
    int arr[3] = {1, 2, 3};
    int *ptr = arr; // 배열의 이름은 포인터 상수이므로 포인터 변수에 할당 가능

    printf("arr[0]: %d\n", arr[0]);
    printf("ptr[0]: %d\n", ptr[0]);
    printf("*ptr: %d\n", *ptr);

    ptr[0] = 4; // 포인터 변수를 이용해 배열의 값을 변경 가능
    printf("arr[0]: %d\n", arr[0]);

    return 0;
}

위의 예제에서 `arr`은 배열이고 `ptr`은 포인터 변수입니다. `arr`는 배열의 이름이므로 포인터 상수이기 때문에 `ptr`에 할당할 수 있습니다. 그리고 `ptr`을 이용해 배열의 값을 변경할 수 있습니다.

반응형
LIST

[C언어 기초 강좌 1] C언어의 기본 printf, scanf, hello world

프로그래밍/C언어
반응형
SMALL

프로그래밍 언어를 공부하면서 가장 처음에 하는 것이

 

hello world를 찍는 것인데요.

 

어떤 프로그래밍을 하더라도 가장 먼저 하는 것이 내가 원하는 글자를 출력하는 것이더군요.

 

그것을 출발로 이것저것 배우는 것이죠.

 

C언어를 만든 사람이 죽고나서 good bye world로 바뀌었다고

 

하기도 하는데요.

 

저는 잘 모르겠군요..

 

그냥 hello world로 하겠습니다.

 

C언어에서 가장 기본 적은 문법은 printf와 scanf를 쓸려면

 

stdio.h 파일을 인크루드 해줘야 합니다.

 

이제 막 C언어를 접하는 사람들은 무슨 소린가 싶겠네요.

 

그냥 이렇게 하는 거구나 생각하세요..ㅋㅋㅋ

 

printf를 구현하기 위한 여러 문법들을 오브젝트 파일 같은 곳에 넣어놓고

 

헤더파일을 인크루드해서 그냥 갖다 쓸 수 있게 만들었다는 것은

 

나중에 실력이 쌓인 후에 알면 되니까요..^^

 

대부분의 개발자들이 C언어를 사용하는데 Visual studio를 사용하죠.

 

간혹 eclipse 를 사용하는 개발자도 있구요.

 

회사에서 visual studio를 사줄 돈이 없으면 이클립스를 사용하죠..ㅋㅋ

 

여튼 이런 것들은 코딩 편집을 쉽게하고

 

컴파일러도 다 들어 있기 때문에 사용자는 그냥 F7같은 컴파일 버튼만 누르면 되죠.

 

F5도 컴파일하죠 다른 버튼 조합도 있고..

 

개발에서 손을 놓은지 좀 되서 기억이안나네요..ㅋㅋㅋ

 

그럼 간단한 hello world를 찍어보죠.

 

참고로 stdio.h의 stdio는 standard input output입니다.

 

스트디오점 에이치라 하지마시고 스탠다드 IO로 읽어주세요..^^

 

좀 있어보이잖아요~~ㅋㅋㅋ

 

#include <stdio.h>

 

int main(void)

{

printf("hello world!!");

 

return 0;

}

 

끝입니다.

 

이것보다 더 간단하게도 되죠.

 

#include <stdio.h>

 

void main(void)

{

printf("hello world!!");

}

 

별 차이 없죠.

 

결과는 같아요..

 

int와 void에 관해서는 나중에 함수를 포스팅할 때 알아볼게요.

 

그냥 머릿속에 있는 것들을 막 꺼내다보니 그냥 두서가 없는 것 같기도하고..ㅋㅋㅋ

 

솔직히 수업한번 들어본 사람은 printf에 대해서 모를 수 없고..

 

printf 관련해서 가장 많이 검색하는 부분이 무엇일까요?

 

바로 %c %d 와같은 문자들입니다.

 

 

이렇게 정의가 되요..^^

 

scanf는 그냥 간단히 말하면 입력을 받기위한 것이에요.

 

그러면 또 한 번 코딩해볼까요?

 

#include <stdio.h>

 

void main(void)

{

int n = 0;

 

printf("숫자를 입력하세요 : ");

scanf("%d\n", &n);

printf("입력한 숫자는 %d입니다.\n", n);

}

 

이렇게 하면 끝나죠..

 

그러면 출력은 어떻게 될까요?

 

그냥 한 번 실행하면

 

출력창

----------------------------------------

숫자를입력하세요 : 

----------------------------------------

 

이상태에서 있습니다. 숫자를 입력하고 엔터를 치면되요.

 

그러면 10이라는 숫자를 쳤다고 할게요.

 

출력창

----------------------------------------

숫자를입력하세요 : 10

입력한 숫자는 10입니다

계속하려면 아무키나 누르세요.

----------------------------------------

 

이렇게 되죠.

 

머 저렇게 되는지 안되는 지는 한 번 해보세요..^^

반응형
LIST

모든 프로그래밍의 기본 if구문과 for 구문

프로그래밍
반응형
SMALL

대학교 2학년 때부터 작년 4월 회사를 퇴사하기 직전까지 손에서 놓지 않고 있었던 프로그래밍인데요.


퇴사를 하면서 다시는 코딩은 안해야지 하면서 새로운 사업을 준비했었는데..


어떻게 하다 보니 사업 중 하나가 애들에게 코딩을 가르쳐 주게 되었네요.


그래서 영어 공부 할려고 했던 블로그를 이렇게 프로그래밍과 제가 알고있는 내용을 교류하는데 쓰기로 했습니다.


추가로 배울 것도 넣었구요.


그곳이 언제 채워질지는 모르겠지만요.


오늘은 각 언어에 대한 정리를 하기에 앞서 제가 프로그래밍을 하면서 느꼈던 것을 좀 말해보려고합니다.


제가 프로그래밍을 한 것은 약 6년인데요. 2009년부터 해서 2015년까지 했으니까요.


물론 예전 대학1학년 때나 중고등학교 때 부운 GW BASIC, VISUAL BASIC은 빼구요.


그 때는 그냥 멋도 모르고 했던거니..ㅋㅋㅋㅋ


그런것들까지 치면 10년은 프로그래밍 했을텐데요.


느낀 것은 딱 1개 입니다. 코딩은 반복과 조건을 얼마나 잘거냐에 따라서


깔끔하게 돌아가냐 안 돌아가냐가 정해진다는 것이죠.


솔직히 다른 문법들을 쓰는 것은 코딩을 더 쉽고 정갈하게 만들어 주는 것이죠..


기본적인 것은 이 2가지로 다 해결이 된다고 생각합니다.


for, if


어떻게 보면 인생도 똑같다 생각이 드는군요..


반복된 삶에서


while(1)

{

...

}


해야할 일을 하는 것(조건문)이 아래 코딩과 같아 보입니다.


while(1)

{

if(...)

{

...

}

...

}


시간은 흐르고 그 흐르는 사이에 시간이 되면 해야할 것을 하고..


열심히 코딩을 할 때는 이런 생각을 해 본적이 없는데..


한 발 물러서니 철학자가 되는 기분이군요..^^


오늘 포스팅에서 하고 싶은 말은


반복문과 조건문을 잘 사용하자는 것이었습니다...ㅋㅋㅋㅋㅋㅋ

반응형
LIST

'프로그래밍' 카테고리의 다른 글

비주얼 스튜디오 2015 무료 버전 설치  (1) 2016.06.24