2013-11-24 4 views
0

포인터로 함께 링크 된 노드가있는 링크 된 목록을 기반으로하는 프로그램을 만들었습니다. 모든 노드는 숫자와 다음 노드에 대한 포인터를 저장하는 정수를 보유합니다. 큐는 FIFO를 따릅니다.링크 된 목록 - 노드의 메모리 주소

EV 완벽한 것이 작동하는 것 같습니다! 대기열에 새 노드를 추가 할 수 있으며 노드를 삭제할 수 있습니다. 모두 FIFO 순서입니다.

이 프로그램은 동적 메모리 할당에 대해

그래서 제 질문은 다음 무엇을 (malloc이 무료 라이브러리 함수를 사용)입니까? 문제는 메모리가 작동하는 방식, 즉 이러한 노드가 힙에 저장되는 경우 - 노드가 다음과 같은 방식으로 저장되는 이유입니다.

1 (205888) 

2 (206032) 

3 (206888) 

4 (206904) 

5 (215896) 

6 (215912) 

7 (215928) 

이것은 프로그램의 출력입니다. 첫 번째는 저장된 정수이고 withing 괄호는 노드에 대한 주소입니다.

그래서 - 메모리에서 일어나고있는 것 같다 뭔가 - - 노드 (5)의 주소 AT & T는보고가 이전 노드와 비교 천에서의 점프 바이트 경우 - 206,904에서 215896.

에 그것을 왜 여기 점프? 어떤 의미가 있습니까? 정말 메모리 누수가 될 수 있을까요? 또는이 방식으로 OS와 컴파일러가 memoryr-allocation을 구성합니까 ???

답변

1

새 노드를 만들어야 할 때 malloc을 사용하여 메모리를 할당한다고 가정합니다. 높은 수준에서, malloc은 요청한 데이터의 크기를 유지할 수있는 메모리 블록을 제공합니다. 사용 가능한 메모리 블럭이 무엇이든간에 찾을 수 있기 때문에, 다른 호출에서 malloc이 반환하는 메모리 위치는 서로 가깝게있을 수 있다는 보장은 없습니다.

그냥 작은 업데이 트 :

내 포인트만큼 당신이 메모리를 해제하고/잃게 포인터를 두지 않는 한, 당신은 괜찮을 것입니다. 메모리 위치에서의 점프는 걱정할 사항이 아닙니다. 메모리 할당은 정상적인 현상이며 프로그램에 문제가 있다는 것을 나타내는 것은 아닙니다.

0

모든 것이 훌륭합니다. 새 블록이 이전 블록 근처에 주소 나 주소를 가져 오는 것만 큼 없습니다. 이전 노드에는 첫 번째 노드의 주소가 포함되어 있습니다. 동적 메모리 할당은 전염성이 없습니다. 예를 들어 malloc 함수는 힙에서 메모리 블록을 요청합니다. 요청이 승인되면 운영 체제는 요청 된 메모리 양을 예약합니다. 그러나 만약 당신이 배열을 사용했다면 주소는 당신에 의해 예상대로되었을 것입니다.