반응형
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 *s = 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 *s = malloc(12);
// Copy string
strcpy(s, "Hello World!");
printf("%s\n", s);
// Free memory
free(s);
}
|
cs |
│ malloc 호출하여 메모리 할당
char *s = 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).
반응형
'C 언어 > C언어 기초' 카테고리의 다른 글
[C언어 #44] 메모리 할당 해제 (malloc / free) - 구조체 (struct) 적용 (0) | 2020.07.16 |
---|---|
[C언어 #43] 메모리 스택 (stack) - 팩토리얼 (factorial) 재귀함수 (0) | 2020.07.15 |
[C언어 #41] 배열에 입력한 숫자의 합 (0) | 2020.07.12 |
[C언어 #40] 표준체중 비만도 (obesity) 구하기 (0) | 2020.07.11 |
[C언어 #40_2] 표준체중 비만도 (obesity) 구하기 (0) | 2020.07.10 |