본문 바로가기

Programming

C/C++ extern memset strcpy

*extern

extern으로 변수를 선언하게 되면, 

외부에서 이 변수를 사용할 수 있게 된다.

전역변수가 되므로, 다른 파일에서도 이 변수를 사용할 수 있다.

결국, 여러 파일에서 공유하는 변수가 된다.


extern int a;

라고 선언을 한 후,

다른 파일에서

int a=3; 이라고 선언하게 되면

새롭게 변수를 선언하는 것이 아니라 이미 선언된 전역변수 a를 초기화해주는 것이 된다.



static은 한 파일 안에서 사용하는 전역변수이다.


함수는 default로 extern으로 선언이 되어 

외부 파일에서 사용이 가능하다.



예제)


-----------------------------------------
// header.h
extern int test;
-----------------------------------------
-----------------------------------------
// test1.c

#include "header.h"

int test = 0;
-----------------------------------------
-----------------------------------------
// test2.c

#include "header.h"

func()
{
    test = 1;
}
-----------------------------------------


*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