728x90
300x250

[C언어] strcpy()의 함정

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

main()
{

 char *ccc;

 strcpy(ccc, "hahaha");

}

포인터와 배열의 관계를 이해하시고 위에 strcpy 함수에 대해 접하시게 된다면 Segment오류로 인해 잠시 고뇌하실것입니다.
혹은 아래와 같이 해결할 수도 있을 겁니다.

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

main()
{

 char ccc[10];

 strcpy(ccc, "hahaha");

}

strcpy()의 원형을 잠시 소개하자면

char *strcpy(char *s1, const char *s2);
strcpy() 함수는 s1인자로 포인터를 받고 s2도 포인터로 받고 있습니다.
즉 첫번째 인자를 두번째 인자로 넘겨줍니다.

*포인터 변수를 다시 생각해보자면, 포인터 변수로 설정이 된 순간부터 이미 우리도 모르는 사이에 주소영역을 사용하고 있을것입니다. 그렇기에 임시로 받아줄 영역을 찾게 되는 것이 아닐까 생각합니다.

imsi 라는 변수는 프로그램이 실행될 때마다 빈 영역의 주소를 찾아 랜덤으로 검색하게 됩니다.
imsi라는 변수 주소중에 비어있는 영역을 찾기위해 아래와 같이 입력할 수 있습니다.

int imsi;
printf("%#010x", &imsi);

찾은 임시 주소가 0x002bfb10와 같다면 아래와 같이 입력할 수가 있습니다.
<string.h> 해더를 불러오지 않을 경우에 심각한 오류가 발생할 수도 있습니다.
(그렇게 심각하지는 않지만 실행이 안되는 경우가 발생하기에 경고 정도로 받아들이시면 되겠습니다.)

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

main()
{
     int imsi;
     char *ccc;

     imsi = 0x002bfb10;

     ccc = (char *)imsi;

     strcpy(ccc, "hahaha");
     printf(ccc);

}

반응형

+ Recent posts