2012-02-09 3 views
1

다음과 같이 :: 내 코드가 있습니다 .. malloc에 ​​행동을 이해 도와다음 malloc 메모리와 SIGSEGV

int main() 
    { 
    int *ptr=NULL; 
    ptr=(int *)malloc(1); 
    //check for malloc 
    *ptr=1000; 

    printf("address of ptr is %p and value of ptr is %d\n",ptr,*ptr); 
    return 0; 
    } 

위의 프로그램은 잘 (오류없이 실행) ... 어떻게 작동? 1 바이트로만 1000의 가치를 제공했습니다!

힙의 다음 메모리 주소를 덮어 쓰시겠습니까? 예인 경우 sigsgev가 있습니까?

+1

동작이 정의되지 :-) 문제가있는 코드에도 불구하고 일하는 모든 일을 포함하여 일어날 수 있다는 것을 의미한다, 그래서 또는 충돌하지 않을 수 있습니다. 일부 구현에서'free (ptr) '할 때 프로그램이 중단됩니다. –

+0

포장으로 무엇인가해야합니까 ?? 일반적으로 32 비트 응용 프로그램과 4 바이트의 기본 포장. –

답변

1

디버그 힙을 사용하면 메모리를 확보 할 때 충돌이나 다른 알림이 표시됩니다 (하지만 무료로 전화하지는 않았습니다).

세그먼트 오류는 페이지 수준 액세스 위반이며 일반적으로 메모리 페이지는 4k 정도이므로 세밀한 검사로 일부 또는 다른 부분을 감지 할 때까지 3 바이트 오버런이 감지되지 않을 수 있습니다 어떤 메모리를 '쓰레기'로 덮어 썼기 때문에 코드가 충돌했습니다.

2

malloc의 많은 구현은 효율성을 위해 특정 "해결 방법"으로 할당합니다. 한 바이트에 대한 요청 심지어 불구하고 있다는 것을 의미

, 당신은 잘하지만

16 또는 32를 찍었을 수 있습니다 그것은 당신이 정의되지 않은 동작 이후에 의존 수있는 일이 아니다.

정의되지 않은 동작은 아무것도

+0

선생님, (어리석은 질문 일지 모르지만 .. 물어볼 필요가 있습니다) "malloc의 많은 구현"은 무엇을 의미합니까 ??? gcc n glibc (표준 웹 사이트에서 다운로드 한 ..)를 사용하는 모든 사람들에게 구현/정의는 동일해야합니다 ... na? n malloc, free 등의 함수에 대한 표준 정의가 없습니까 ?? – saurabh

+0

@saurabh : 예, gcc (또는 mor 올바르게 glibc)가 특정 구현을 가질 수 있지만 그 중 하나만있는 것은 아닙니다. MSVC에는 자체 IBM CSL이 있고 또 다른 SVL이 있습니다. GLibC는 _one_ 구현 일뿐입니다. 그리고 예, ISO C 표준은 정의를 지정하지만 일반적으로 _implementation보다는 _behaviour_를 다루고 있습니다. _ – paxdiablo

+0

대부분의 'malloc'구현은 운영 체제 (일반적으로 시스템 호출을 통해 커널)에서 힙 메모리를 훨씬 더 큰 덩어리로 묻습니다 일반적으로 몇 페이지의 4Kbytes). 리눅스에서,'malloc'은 아마도'mmap' (그리고 아마도'sbrk') syscall을 사용하여 커널에서 "큰 용량의"메모리를 요청할 것입니다. 그렇다면'malloc'의 구현은 그 조각을 더 작은 조각들, 등으로자를 것입니다. 평소처럼, 악마는 세부 사항에 있습니다. –