본문 바로가기
2022-2/시스템 프로그래밍

10장 메모리 관리

by 철없는민물장어 2022. 11. 11.
728x90
반응형
10.2 동적 할당

필요할 때 필요한 만큼만 메모리를 요청해서 사용하여 메모리를 절약할 수 있다.

사용 후 더 이상 필요가 없을 경우, 해당 영역을 반납한다ㅣ

  • malloc()
  • calloc()
  • realloc()
  • free()

 

malloc을 사용한 동적 메모리 할당

#include <stdlib.h>

void *malloc(size_t size);
void free(void *ptr);

malloc()은 void*타입이므로 사용시 형변환이 필수이다.

 

#include <stdlib.h>

void *calloc(size_t n, size_t size);
//크기가 size인 메모리 공간을 n개 할당한다. 값을 모두 0으로 초기화한다.

calloc의 경우 모든 바이트를 0으로 초기화한다.

 

#include <stdlib.h>

void *realloc(void *ptr,size_t newsize);

realloc

 

malloc을 사용한 예시 stud1.c>>

더보기
#include <stdio.h>
#include <stdlib.h>
struct student{
    int id;
    char name[20];
};

int main()
{
    struct student *ptr;
    int n,i;
    printf("몇 명의 학생을 입력하시겠습니까?");
    scanf("%d",&n);
    if(n<=0){
        fprintf(stderr,"오류: 학생 수를 잘못 입력하였습니다");
        fprintf(stderr,"프로그램 종료");
        exit(1);
    }
    ptr=(struct student*)malloc(n*sizeof(struct student));
    if(ptr==NULL){
  		perror("malloc");
        exit(2);
    }

    printf("%d 명의 학번과 이름을 입력하세요.\n",n);
    for(i=0;i<n;i++)
        scanf("%d %s\n", &ptr[i].id, ptr[i].name);
    printf("\n*학생 정보(역순) *\n");
    for(i=n-1;i>=0;i--)
        printf("%d %s\n",ptr[i].id, ptr[i].name);
    printf("\n");
    exit(0);
}

 

(참고) C언어에서의 메모리 관리 함수

#include <string.h>

void *memset(void *s, int c, size_t n);
//s부터 n바이트만큼 바이트c로 설정하고 s를 반환

int memcmp(const void *s1, const void *s2, size_t n);
//s1과 s2의 첫 n바이트를 비교, 내용이 동일하면 0, s1이 작으면 음수 크면 양수 반환

void *memchr(const void *s,int c, size_t n);
//s가 가리키는 메모리의 n바이트 범위에서 문자c를 탐색. 찾으면 처음 발견한 바이트의 포인터 반환, 없으면 NULL

void *memmove(void *dst, const void *src, size_t n);
//dst에다가 src를 n바이트 복사하고 dst반환

void *memcpy(void *dst, const void *src, size_t n);
//dst에 src의 n바이트를 복사하고 dst반환. 두 메모리 영역은 겹쳐지지 않음

 

mem함수 사용예시>>

더보기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char str[32]="DO you like Linux?";
    char *ptr, *p;
    ptr = (char *)malloc(32);
    memcpy(ptr,str,strlen(str));
    puts(ptr);
    memset(ptr+12,'|',1);
    puts(ptr);
    p=(char*)memchr(ptr,'|',18);
    puts(p);
    memmove(str+12,str+7,10);
    puts(str);
}

 

728x90
반응형

'2022-2 > 시스템 프로그래밍' 카테고리의 다른 글

계정과 권한/패스워드 크래킹  (0) 2022.11.22
9장 프로세스 제어  (1) 2022.11.16
8장 프로세스  (1) 2022.11.08
5. 파일 시스템  (0) 2022.11.02
4장 파일 입출력  (0) 2022.10.30

댓글