2017-11-13 11 views
-4

후, 우리는 malloc에로의 인스턴스를 할당 : 지금까지 이해 한 내용으로 당malloc을 사용하여 struct를 할당하면 메모리의 어디에 할당 된 struct 필드가 있습니까? 여기에 우리가 구조체를

typedef struct _MyStruct { 
    struct *nextStruct; 
    char array[4]; 
} MyStruct 

/* Allocates space on heap for the struct */ 
_MyStruct *m = malloc(sizeof(MyStruct)); 
printf("%zu bytes\n", sizeof(MyStruct)); /* Outputs: 8 bytes */ 

int r; 

/* We intentionally overflow the buffer inside of the struct */ 
r = (int)gets(m->array); /* Input */ 
    if (r == 0) 
     return; 

합니다. 이 확인은 맞습니까?

  1. 문자열 'abcde'(5 바이트)를 채울 때 스택에있는 구조체 내부의 char 배열을 오버런합니다.

  2. 문자열 'abcdefghi'(9 바이트)를 삽입하면 힙에있는 것으로 가정하는 구조체 자체를 오버런합니다. 그러나 스택의 char 배열을 오버런시킵니다.

편집 : 더 정확하려면이 문제가는 i686에 의해 구현되는 C99 표준을 기반으로 O.S.

+2

아니, char 배열을 포함하는 구조체 m 완전히 힙에 다음 구조체에 대한 포인터를 의미, 힙,하지 힙 자체에 구조체의 구조체의 ADRESS을 덮어 가정합니다 스택에 없습니다. 힙이 있거나 ... 스택이 있다면 ...) – Ctx

+0

나는 그것을 분명히 이해하고있다. :) 나는 여러 개의 가이드를 읽고 있는데, 나는 그것을 망쳐 놓았다. 힘내 친구 야. – another

+1

C 언어에는 스택이 없습니다. – Olaf

답변

0

문자열 'abcde'(5 바이트)를 채울 때 스택에있는 구조체 내부의 char 배열을 오버런합니다.

아니요, 구조체 및 관련 요소는 malloc을 통해 동적으로 생성됩니다. 따라서 char 배열을 포함한 전체 구조체가 힙에 놓입니다.

+0

정말이 답변으로 내 작업을 신속하게 진행할 수 있습니다. 문제는 지금 디버깅 및 메모리 주소 분석에 많은 시간을 할애 할 수 없다는 것입니다. 하지만 지금은 모든 것을 알아낼 수 있습니다. 고맙습니다! – another

+0

따라서 char 배열을 재정의하면 char 배열이 개별적으로 힙에서 재정의됩니까? – another

+0

아니요. 문자 배열의 경계를 덮어 쓰면 정의되지 않은 동작이 발생합니다. 그 이상의 메모리가 손상 될 수 있습니다. C는 컴파일러가 구조체의 요소를 재정렬하는 것을 허용하지 않기 때문에 동일한 구조체의'nextstruct' 포인터 값이 더 낮은 메모리 주소에 있기 때문에 손상되지 않도록해야합니다. 그러나 이것은 UB이기 때문에 어떤 것도 발생할 수 있습니다. – MFisherKDX