[C언어] strcpy()의 함정
#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라는 변수 주소중에 비어있는 영역을 찾기위해 아래와 같이 입력할 수 있습니다.
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);
}
'소프트웨어(SW) > GNU - C, C++' 카테고리의 다른 글
[C언어] main()함수의 인자 활용(명령행 인자 : argc, argv) (6) | 2009.11.05 |
---|---|
[C언어] 제어문(if, switch) (9) | 2009.07.23 |
[C언어] 교환 Swap 알고리즘 (8) | 2009.07.05 |
[C++] 입출력 - 표준 출력 (8) | 2009.07.04 |
[C언어] 문자열과 포인터 배열 (156) | 2009.06.07 |