2014-03-13 2 views
0

저는 cpp의 기본적인 것들을 가지고 놀고 있습니다. 저는이 언어로 새로운 사람입니다. 그래서 제 질문이 올바르게 공식화되지 않았다고 경고합니다. 어떤 도움을 주셔서 감사합니다.이 코드는 할당 된 범위 바깥에 문자를 추가하는 것 같습니다

#include <stdio.h> 

int main (void) { 
    char *str; 
    str = (char*) malloc(2); 
    str[0] ='8'; 
    str[1] ='8'; 
    str[2] ='6'; 
    str[3] ='\0'; 
    printf ("%s\n",str); 
} 

그리고 컴파일 :

gcc -O0 -pedantic -Wall test2.cpp 

(GCC 버전 4.7.2)

문제는 이후 내 코드와 자신을 발견 www.cplusplus.com/reference/cstdlib/malloc/의 예를 본 것입니다

오류가없고 출력이 886입니다. 왜 오류가 발생하지 않습니까? 할당 된 공간의 경계를 지키지 않았습니까?

오류가 발생하지 않았으므로 출력이 886입니다. 오류가없는 이유는 무엇입니까? 할당 된 공간의 경계를 지키지 않았습니까?

코드가 정상인 경우 ... 참조 용 예제가 왜 필요합니까? 다른 (더 가능성이 높은) 경우 ... 위험은 무엇입니까?

감사합니다.

+0

괜찮은 정적 분석 도구 (예 : cppcheck)를 사용하면 (필자도 Eclipse CDT C++ SA 파서가한다고 생각합니다.) 알려 주어야합니다. –

+0

감사합니다. C++에서 아주 멀었습니까? 주요 차이점은 무엇입니까? 초보자가 어떻게 다른 것을 구별 할 수 있습니까? (포트란에서 나는 각 버전에서 sintax가 무엇인지 알기 위해 수년이 걸린다) – alexis

+0

가장 쉬운 단서는'malloc'과'printf'를 사용하는 것이다. 대부분의 C++ 코드는'new'와'cout'을 사용합니다. –

답변

5

C 및 C++에서 경계 검사를 수행하지 않으므로 오류가 발생하지 않습니다. 당신은 사용하지 않았던 메모리 섹션을 덮어 썼지 만 운이 좋았고 중요한 것은 아니 었습니다. 스터드가있는 벽에 손톱 줄을 넣는 것과 비교하십시오. 스터드를 놓치면 대부분의 시간 동안 석고에 구멍을 뚫지 만, 결국에는 위험한 상태가되기 때문에 결국에는 라이브 와이어 중 하나에 충돌하게됩니다.

3

할당 된 메모리의 경계를 넘어 섰습니다.

그러나 printf는 선언 한 메모리의 크기를 신경 쓰지 않습니다. 처음부터 시작하여 0이 될 때까지 계속됩니다.

작성한 사례는 정의되지 않은 동작입니다. 할당 된 영역 (다른 변수) 바로 뒤에 다른 데이터가있을 수 있습니다.이 경우 다른 데이터가 손상 될 수 있습니다. 다음 부분이 할당되지 않은 메모리 인 경우 눈에 보이는 문제없이 도망 갈 수 있습니다. 그리고 할당 된 메모리가 다른 프로세스에 속한 메모리가 있으면 멋지고 깔끔한 Segmentation Fault가 표시됩니다. 결과는 더욱 악화 될 수 있으므로 어디서나 시도하지 않는 것이 좋습니다.

+0

고마워요! 매우 빠른 답변! 훌륭한 포럼, 훌륭한 사용자. – alexis

1

다음은의 glibc malloc.c 파일에 주석에서 찾을 수 있습니다

할당 덩어리 당

최소 오버 헤드 : 4 또는 8 바이트 각 덩어리가 오버 헤드 지주의 크기 및 상태 정보의 숨겨진 단어를 가지고 malloc으로 할당 .

최소 할당 크기 : 4 바이트 ptrs :

청크가 해제

, 12 (4/8 오버 헤드를 포함) 32분의 24 바이트 (4 헤드 포함) 8 바이트 ptrs 16 바이트 (4 바이트 ptrs) 또는 20 (8 바이트
ptrs하지만 4 바이트 크기의 경우) 또는 24 (8/8) 추가 바이트가 필요합니다. 후행 크기 필드에는 4 (8), 사용 가능리스트에는 8 (16) 바이트 포인터가 사용됩니다. 따라서 할당 가능한 최소 크기는 16/24/32 바이트입니다.

최소 할당 크기가 16/24/32이므로 3 바이트보다 커서 프로그램이 오류없이 실행됩니다. 이것이 프로그램을 올바르게 실행할 수있는 가능성 중 하나입니다.

+1

가능한 모든 구현 중 하나 (!)입니다 - 작은 메모리가있는 임베디드 시스템 용 malloc은 요청 된 메모리를 정확히 할당 할 수 있습니다 (그 이상은 없습니다) –

+0

@ DieterLücking 예, 이것이 가능한 구현 중 하나입니다. malloc의 일종의 구현. – Balu

+1

감사합니다. 이것은 또한 도움이됩니다. 사실 나는 어떤 종류의 도움을 요청하고 항상 배웁니다. – alexis

관련 문제