2014-09-11 2 views
0
#include <stdio.h> 
#include <stdlib.h> 

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

안녕하세요, malloc 함수가 무엇을하는지 이해하려고합니다. 내가 위의 코드는 문자열 'a'에 단지 2 바이트의 메모리를 선언하기 때문에 오류를 반환해야한다는 것을 알았습니다. 그러나 오류를 표시하지 않습니다. 이유를 설명하십시오.문자열을 C로 저장하는 malloc 함수

+3

정의되지 않은 동작이 표시됩니다. –

+0

정의되지 않은 동작은 무엇입니까? 설명해주세요. – Lokesh

+2

* 관찰 된 동작과 * 정의 된 * 동작을 혼동하지 마십시오. 프로그램이 잘못 구성되었습니다. 따라서, 거의 모든 것을 전시 할 수 있으며, 불운 한 경우에도 일할 수도 있습니다. – WhozCraig

답변

5

할당 된 메모리의 끝을 벗어나는 액세스는 정의되지 않은 동작입니다. 즉, 응용 프로그램이 중단되거나 예상대로 작동하지 않을 수 있습니다.

malloc()은 일반적으로 최소 정렬 sizeof(void*)의 배수로 메모리를 할당합니다. 따라서 때때로 부정적인 결과없이 필요한 크기를지나 몇 바이트를 액세스 할 수 있습니다.

년에 주목가는 힙 메모리에 관련된 정의되지 않은 동작의 주목할만한 몇 :

The poisoned NUL byte, 2014 edition :

홀수의 malloc()이 크기는 항상 오프 오프 별 하나가 발생합니다 malloc() 최소 정렬은 sizeof (void *)로 인해 끝이 무해합니다.

How Microsoft Lost the API War는 :

내가 먼저 자신의 응용 프로그램에서 중요한 버그가 있다고 얘기 히트 게임 심시티의 개발자 중 하나 이것에 대해 들었 : 그것은 바로 그것을 해제 후 메모리를 사용 DOS에서 OK로 작동하지만 Windows에서 작동하지 않는 주요 no-no는 해제 된 메모리가 다른 실행중인 응용 프로그램에 즉시 영향을받을 수 있습니다. Windows 팀의 테스터는 여러 가지 인기있는 응용 프로그램을 거치면서 제대로 작동하는지 테스트했지만 SimCity는 계속 충돌했습니다. 그들은 SimCity를 해체 한 Windows 개발자에게이 사실을 알려주고 디버거에서 단계별로 실행 한 다음 버그를 발견하고 SimCity가 실행 중인지 확인하는 특수 코드를 추가했습니다.이 경우 SimCity가 실행되는 특수 모드로 메모리 할당자가 실행되었습니다. 메모리를 확보 한 후에도 메모리를 사용할 수 있습니다.

+0

오케이! 이제 이해가된다. 감사! – Lokesh

+0

이 예제는 매우 동기 부여가됩니다. 하하 – Lokesh

+0

한 가지 더 부탁합니다. 문자열에 4 문자를 저장하려면 malloc을 5 바이트로 할당하는 것이 더 좋으므로 마지막 바이트는 '\ 0'을 저장할 수 있습니다. – Lokesh

1

코드 구문이 올바른지 바운드가은 C에서 수행되지 확인 정의되지 않은 동작이며, malloc을 사용 및 포인터 사용하지만, static code analysis을 수행하지 않습니다 컴파일러가 확인하는 경우 그 사용 조합 말이된다.