2011-02-24 7 views
3

문자열이 9 자 이상이되면 오류가 발생하지 않아야합니까?C에서 calloc()을 사용하는 방법?

// CString.c 
// 2.22.11 

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

main() 
{ 
    char *aString = calloc(10, sizeof(char)); 

    if (aString == NULL) 
    { 
     return 1; 
    } 

    printf("PLEASE ENTER A WORD: "); 
    scanf("%s", aString); 

    printf("YOU TYPED IN: %s\n", aString); 
    //printf("STRING LENGTH: %i\n", strlen(aString)); 
} 

감사

blargman

+0

scanf가 전달하는 것은 포인터입니다 .. 그리고 c 실행 시간은 할당 된 포인터의 크기에 관한 정보를 담고 있지 않습니다 ... 잘 데이터를 저장할 수는 있지만 표준 C 프로그램에는 접근 할 수 없습니다 ... 당신 – vrdhn

답변

6

구문이 올바른지 때문에 당신은 컴파일러 오류가 발생하지 않습니다. 올바르지 않은 것은 논리이며, 버퍼의 끝을 지나서 메모리에 쓰고 있기 때문에 정의되지 않은 동작입니다.

왜 정의되지 않은 동작입니까? 글쎄, 당신은 그것이 당신에게 속하지 않는다는 것을 의미하는 그 기억을 할당하지 않았다 - 당신은주의 테이프로 폐쇄되는 영역으로 침입하고있다. 프로그램이 버퍼 다음에 메모리를 직접 사용하는 경우를 고려하십시오. 버퍼 오버런 때문에 메모리를 덮어 썼습니다.

이 같은 크기 지정자를 사용하는 것이 좋습니다 :

scanf("%9s", aString); 

그래서 당신은 당신의 버퍼 오버런니까.

+2

@blargman : ** 정의되지 않은 동작이란 ** *** 아무거나 *** ** 일어날 수 있다는 것을 의미합니다 **. 여기에는 프로그램 작동을 허용하는 것도 포함됩니다. 또한 컴퓨터 충돌로 인해 휴대 전화가 폭발하고 지구의 회전을 멈추게하고 히틀러의 삶을 다시 시작하게됩니다. 즉, "정의되지 않은 동작"은 "이것이 원하는 방식대로 작동한다는 보장이 없습니다"를 의미합니다. 정의되지 않은 동작을 사용하여 예상되는 동작을 일관성있게 유지할 수는 없습니다. –

+0

@blargman : 프로그램에서 수행 할 작업에 대한 보장은 없습니다. 지금 일어나고있는 일은 당신이 적절히 할당하지 않은 메모리에 글을 쓰고 있다는 것입니다. 완벽하게 작동하는 것에서부터 충돌하는 프로그램에 이르기까지 어떤 일이 일어날 수 있습니다. –

+1

그래서, 이것이 버퍼 오버 플로우의 인스턴스입니까? – nambvarun

1

예, 오류가 발생했습니다. 그리고 가장 불행한 부분은 당신이 그것에 대해 모른다는 것입니다. 당신은 신비하게도 뭔가 잘못되었을 때 (운이 좋다면), 또는 고객의 변호사가 당신을 고소 할 때 (프로그램이 아니라면) 프로그램에서 나중에 알 수 있습니다.

관련 문제