이 코드의 실행결과는 어떻게 될까요?

redpig의 이미지

char buffer[100]={0};
strncpy(buffer, "TEST", -1);
printf("%s\n", buffer);

그냥 심심해서( :oops: ) 위 코드를 컴파일해서 실행해 보니 아무값도 출력안되네요.
어떻게 된걸까요?
윈도2k 머신에서 VC6로 컴파일했습니다.
증말 초보라서 허접한 질문이지만 답변 부탁드립니다.

raynear의 이미지

어디서부터 답변을 드려야 될지 모르겠네요... ㅡㅡ;;

우선 strncpy의 사용법을 확인 해 보시죠.

strncpy의 마지막 인자가 -1이라는게... ㅡㅡ;;

그런거 없다

hanseok의 이미지

redpig wrote:
char buffer[100]={0};
strncpy(buffer, "TEST", -1);
printf("%s\n", buffer);

그냥 심심해서( :oops: ) 위 코드를 컴파일해서 실행해 보니 아무값도 출력안되네요.
어떻게 된걸까요?
윈도2k 머신에서 VC6로 컴파일했습니다.
증말 초보라서 허접한 질문이지만 답변 부탁드립니다.

뭐 그냥..
strncpy 에서 3번째 아큐먼트는..? 몇개를 복사할것인지 알려주는 것입니다.
-1 이면 이것 만큼 복사를 해야하는데.. 아무것도 복사를 안하게 되고
결국 buffer에는 {0} 이란것이 들어있게 됩니다.
buffer를 출력하면 {0} 이 출력되는것이겠죠.

==3==3

잠이 들어야지만 꿈을 꿀수 있는것인가?
우리는 항상 꿈을 쫓아 가며 살아가는 사람들..

doldori의 이미지

strncpy()의 마지막 인자는 size_t로서 이는 무부호 정수형입니다. 예를 들어
typedef unsigned int size_t;
로 정의된 구현체의 경우 -1은 변환 규칙에 따라 UINT_MAX로 변환됩니다.
UINT_MAX의 값은 buffer의 크기 100보다는 훨씬 크지요. 그러나 strncpy()
내부에서는 buffer의 크기를 알지 못하며 주어진 바이트수(UINT_MAX)만큼 무작정
복사를 합니다. 그런데 복사하는 과정에서 buffer의 범위를 벗어나고(buffer overrun)
그 결과는 정의되지 않습니다.

IDNed의 이미지

BOF될듯 하네요...

32bit 시스템에서는 4294967295바이트가 복사될테니까...

Quote:

char* strncpy(char* s, const char* ct, size_t n);
Copies at most n characters of ct to s. Pads with NUL characters if ct is of length less than n. Note that this may leave s without NUL-termination. Return s.

그러니까 buffer의 한계(100바이트)를 넘어서서 스택을 완전히 변조시켜서(RET가 NULL이 되버리는??) 세그먼트 폴트가 날듯...

실제로는 세그먼트 폴트(Segmentation Fault)라는 에러메시지"마저"도 변조가 되는 듯합니다...

그러니까 엄청난 양의 메모리를 NULL로 덮어씌우신 효과가 날듯..