*extern
extern으로 변수를 선언하게 되면,
외부에서 이 변수를 사용할 수 있게 된다.
전역변수가 되므로, 다른 파일에서도 이 변수를 사용할 수 있다.
결국, 여러 파일에서 공유하는 변수가 된다.
extern int a;
라고 선언을 한 후,
다른 파일에서
int a=3; 이라고 선언하게 되면
새롭게 변수를 선언하는 것이 아니라 이미 선언된 전역변수 a를 초기화해주는 것이 된다.
static은 한 파일 안에서 사용하는 전역변수이다.
함수는 default로 extern으로 선언이 되어
외부 파일에서 사용이 가능하다.
예제)
*memset
void * memset ( void * ptr, int value, size_t num );
메모리 블록을 채우는 함수이다.
ptr로 시작하는 메모리 주소부터 num 만큼의 바이트를 value값으로 채운다.
이때, value는 unsigned char로 형변환 된다.
예제)
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "almost every programmer should know memset!";
memset (str,'-',6);
puts (str);
return 0;
}
*strcpy
char * strcpy ( char * destination, const char * source );
source 가 가리키는 C 형식의 문자열 (널null 종료 문자열) 을 destination 이 가리키는 곳에 복사한다. 이 때, 널도 포함해서 복사한다.
오버플로우를 방지하기 위해서, destination 이 가리키는 배열의 크기는 반드시 source 문자열의 크기와 같거나 이보다 커야 한다. 또한, 복사하는 영역이 source 와 겹치면 안된다.
참고로 위와 같은 오버플로우 문제를 방지하기 위해 ISO/IEC TR 24731 에서 제안된 strcpy_s 함수를 이용하면 된다. 이 함수는 마이크로소프트 C 런타임 라이브러리와 일부 C 라이브러리에서 사용 가능하다. 하지만 GLibc 와 같은 라이브러리 에서는 지원되지 않는다. 일각에서는 마이크로소프트 컴파일러가 strcpy 나 strncpy 함수를 사용시 경고 메세지를 뜨게 하는 이유가, 자사의 플랫폼에만 묶어두기 위한 계획이라고도 한다. 이 strcpy_s 함수는 만일 source 의 크기가 destination 보다 크다면 복사를 수행하지 않고 0 이 아닌 값을 리턴하며, (호출자가 리턴값을 무시하였을 때를 대비하여) 버퍼를 비워버린다.
참고
http://itguru.tistory.com/79
'Programming' 카테고리의 다른 글
Algospot - [COINS] CoinChange (0) | 2016.05.23 |
---|---|
[C/C++]Combination 함수에 대해 고민해보기 (0) | 2016.05.06 |
C/C++ argc, argv (0) | 2014.07.26 |
VS2012 MFC 프로젝트 생성 (0) | 2014.07.12 |
gcc 기본 (0) | 2014.07.01 |