티스토리 뷰

문자열 복사하기

#include <cs50.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>

int main(void)
{
  char *s = get_string("s: "); // leo
  char *t = s;

  t[0] = toupper(t[0]);

  printf("s: %s\n, s"); // Leo
  printf("t: %t\n, t"); // Leo
}

t에 s를 할당하고, t의 첫글자를 uppercase로 바꾸고 난 뒤 t와 s를 출력하면 두 개 모두 첫글자가 대문자로 출력된다. 왜냐하면 t는 s가 갖고 있는 주소를 가리키고 있기 때문이다. 즉 s가 갖는 주소에 있는 값이 변하면, t도 동일한 것을 보고 있으므로 역시 똑같이 변한 값이 출력된다.

#include <cs50.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>

int main(void)
{
  char *s = get_string("s: ");
  char *t = malloc(strlen(s) + 1); // +1은 null 종단문자 때문
  // 루프를 돌면서 값을 복사하는 밑의 과정은 strcpy(t, s) 로 간단하게 나타낼 수 있다. 
  for (int i = 0, n = strlen(s); i < n + 1; i++) // 여기서 인덱스 n까지 도는 건 널 종단 문자까지 복사하기 위해서
  {
    t[i] = s[i]; 
  }
  t[0] = toupper(t[0]);

  printf("s: %s\n, s"); // Leo
  printf("t: %t\n, t"); // leo
}

그렇다면 위 실수를 반복하지 않기 위해, 값을 하나하나 복사해서 넣어보자. 먼저 s가 차지하는 메모리 공간만큼 malloc 함수로 메모리를 할당해준다. malloc 함수는 메모리를 할당하고, 할당하는 메모리의 첫번째 주소를 리턴해준다. 그걸 t에 저장하는 것이다.

루프를 돌면서 반복하는 이 과정은 strcpy라는 문자열 복사 함수로 간단하게 쓸 수도 있다. 다만 복사하려는 변수에 메모리가 충분히 할당돼 있지 않으면 버퍼 오버플로우가 생길 것이다. (이걸 방지하는 것이 strncpy)

메모리 해제

malloc의 반대 = free

malloc 함수로 메모리를 할당해줬다면 free함수로 메모리를 해제해줘야 한다. 안 그러면 더 이상 사용되지도 않는 값들이 메모리에 남아서 쓰레기 값(garbage value) 이 되고 메모리 낭비가 발생하면서 프로그램이 느려지기 때문이다.

  • valgrind사용방법은 소스코드를 컴파일한 뒤 valgrind 명령어로 파일을 실행하면 된다.
  • $ make test $ valgrind ./test
  • valgrind라는 프로그램으로 메모리와 관련된 문제가 있는지 확인할 수 있다. 먼저 valgrind를 설치한 뒤(macOs에서는 홈브류로 설치 -> brew install valgrind)
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함