반응형

c언어 메모리 할당 및 해제 (malloc / free) - 문자열 복사에 적용

 

 

문자열 복사 함수 (stringCopy) 생성하여 사용

allocate / free memory - String copy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* String copy using malloc/free */
#include <stdio.h>
#include <stdlib.h>
 
// Get length of string array
int getStringLength(char t[]) {
    int len = 0;
    for (int i = 0; t[i] != '\0'; i++) len++;
    return len;
}
 
// Copy string array t[] to array s[]
void stringCopy(char s[], char t[]) {
    int i = 0;
    for (i = 0; t[i] != '\0'; i++) s[i] = t[i];
    s[i + 1= '\0';
}
 
int main() {
    char t[] = "Hello World!";
    int len = getStringLength(t);
 
    // call malloc to allocate memory
    char *= malloc(len);
 
    stringCopy(s, t);
    printf("%s\n", s);
 
    // call free to explicitly free memory
    free(s);
}
cs

 

 

 

 

 

문자열 복사 함수 (strcpy) 사용

allocate / free memory - strcpy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Copy string using malloc/free */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main() {
    // Call to malloc allocates the memory
    char *= malloc(12);
 
    // Copy string
    strcpy(s, "Hello World!");
    printf("%s\n", s);
 
    // Free memory
    free(s);
}
cs

 

 

 malloc 호출하여 메모리 할당

char *= malloc(12);
  • 변수를 배열의 첫번째 항목을 가리키는 포이터로 선언
  • malloc의 변수(argument)는 필요로 하는 바이트수(bytes)
  • malloc의 리턴타입은 void (여러 포인터 타입과 양립/호환 가능)
  • malloc 호출 이후, 포인터 변수 s 는 새로 할당된 공간을 가리킨다

 

 

 문자열 복사

strcpy(s, "Hello World!");
  • 문자열 복사
  • 새 메모리는 배열과 유사하게 번호를 매긴다 (Indexing)
  • ex. s[0] = 'H';
  • 컴파일러는 포인터로 접근한 메모리를 배열 표기법으로 표시한다.
  • ex. s[i] *(s+i) 는 사실상 동일하다
  • 실제로 배열과 배열의 시작을 가리키는 포인터는 다르다
  • 다만, 표시를 함에 있어 컴파일러가 동일하게 취급한다.

 

 

 할당한 메모리 해제

free(s);
  • 메모리 누출 방지를 위해 할당한 메모리는 회수해야 한다.
  • 메모리 회수 이후 힙(heap)은 줄어들지 않지만, 갭(gap)이 발생한다.
  • malloc은 적합한 갭(gap)을 찾고, free는 갭(gap)을 합친다(merge).

 

 

 

반응형