궁금증 연구소

안녕하세요. 궁금증연구소입니다.

오늘 포스팅 주제는 "[c언어] strcat 사용 시 주의할 점"입니다.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main(){

    char *arr[] = {"pascal","delphi","basic","python"};
    int h;
    char *pa;

    h=0;
    for(int i=0; i<4; i++)
        h += (strlen(arr[i])+1);
    
    pa = new char[h];
    

    for(int i=0; i<4; i++){
        strcat(pa, arr[i]);
        if (i<3)
            strcat(pa, ",");
    }
    puts(pa);
    delete[] pa;
}

위 코드는 틀렸다. 왜 틀렸을까?

 

동적 할당된 포인터 pa 내에는 쓰레기 값이 들어 있다. 즉 초기화되지 않았다. 이 상태에서 strcat을 활용해 pa에 arr의 문자열을 차례대로 이어 붙이려고 한다. 이때 생각해야 할 것은 strcat 함수가 작동할 수 있는 것은 문자열 끝에 존재하는 NULL(0) 값 때문이라는 점이다. 그런데 pa는 초기화되지 않았기 때문에 pa 내에는 strcat에 활용할 0이 존재하지 않는다는 점이다. 우연히 0이 있을 수도 있지만, 오히려 엉뚱한 값에 strcat을 할 위험요소가 있다.

 

따라서 동적 할당을 한 이후, strcat 등을 활용해 해당 메모리 공간에 문자열을 넣으려고 할 경우, 먼저 초기화를 해주는 것을 까먹으면 안 된다.

 

초기화 코드

 

따라서 위와 같인 p [0]=0 식으로 메모리 값에 0 값을 초기화해 준후, strcat을 사용해야 한다. strcat 함수의 경우 끝에 자동으로 0을 붙이므로 *pa=0 은 해줄 필요가 없다. 단, strcat이 아니라 동적 할당된 공간에 일일이 값을 넣어줄 경우에는 반드시, 마지막에 0을 넣어주어야 한다.

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading