2013-10-10 2 views
6

왜 .. 같은 작업을 아래의 malloc없이 수행 할 수있을 때 내가 malloc을을 사용구조체와 함께 malloc을 사용하는 이유는 무엇입니까?

내가 메모리 위치를 초기화하지 않는 방법 N1 이해하기 힘든 시간을 보내고 있어요
#include <stdio.h> 
#include <conio.h> 

struct node { 
    int data; 
    struct node *l; 
    struct node *r; 
}; 

int main(){ 
    //Case 1 
    struct node n1; 
    n1.data = 99; 
    printf("n1 data is %d\n", n1.data); 

    //Case 2 
    struct node *n2 = (struct node *) malloc (sizeof(struct node)); 
    n2 -> data = 4444; 
    printf("n2 data is:%d\n",n2 -> data); 
    free(n2); 

    return (0); 
} 
  1. 데이터를 저장할 수 (99).
  2. 때 제 경우 경우 2.

답변

9

왜 .. 같은 작업 수수 아래 등의 malloc없이 수행 할 때 malloc을을 사용

당신의 malloc을 사용 , 힙에 메모리를 할당하고 malloc없이 스택 메모리에 구조체를 배치합니다.

초기화되지 않은 n1이 기억 위치에 어떻게 저장 될 수 있는지를 이해하는 데 어려움이 있습니다 (99).

데이터가 n1.data = 99; 일 때 초기화됩니다. 그렇지 않으면 저장됩니다.사용하는 경우 2

사례 1의 경우 1을 사용하는

2) 당신이 제한된 범위 내에서 구조 객체를 사용하게 될 것을 알고, 사용, 그리고 뜻한다 해당 범위를 벗어난 구조 데이터에 대한 참조를 작성해야합니다.

사례 2는 여러 장소에서 구조를 사용할 때 사용되며 수동으로 (그리고 신중하게) 메모리를 관리하고자 할 때 사용됩니다. 이 방법의 장점은 프로그램 범위의 일부에서 구조를 만들고 초기화하고 포인터를 만들고 주위로 포인터를 전달하는 것입니다. 4 바이트 포인터를 전달하는 것이 구조 자체를 전달하는 것보다 훨씬 효율적이기 때문입니다.

+0

당신은 내 전문가입니다! 정확한 답변을하고 내 마음 속에있는 모든 질문을 해결했습니다.내가 당신에게 1000 표를 줄 수 있으면 좋겠다. 하 .. 감사합니다. –

+1

''4 바이트 포인터는 메모리에 복사하는 대신 레지스터에 전달할 수있는 것보다 훨씬 효율적입니다. –

2

를 사용하는 경우에는 1을 사용할 때, 메모리 스택에 할당된다. 변수 n1이 범위를 벗어나 실행되면 메모리가 해제됩니다.

두 번째 경우에는 메모리가 힙에 할당됩니다. 메모리 리소스를 명시 적으로 해제해야합니다 (예 : free).

제한된 크기의 로컬 임시 데이터 구조에 스택 할당 메모리를 사용할 수 있습니다 (스택은 컴퓨터 메모리의 일부일 뿐이며 플랫폼마다 다릅니다). 지속시키려는 또는 큰 데이터 구조에 힙을 사용하십시오.

stack and heap에 대한 인터넷 검색은 훨씬 더 많은 정보를 제공합니다. struct node의 크기에 해당

3
int main() { 
    struct node n1; 
    n1.data = 99 

(main의 프레임 단위) 스택에이 예비 공간. 이를 로컬이라고하며 main 컨텍스트 내에 만 존재합니다.

struct node *n2 = (struct node *) malloc (sizeof(struct node)); 

에 할당합니다. 이 메모리는 현재 사용중인 함수 컨텍스트에 관계없이 존재합니다. 일반적으로 "동적 할당"이라고합니다.

이러한 node 구조는 임의로 노드를 추가, 제거, 재주문 할 수있는 linked list의 기초입니다.

은 참조 :

1

일반적으로 응용 프로그램을 실행하기 전에 필요한 메모리 크기를 모르는 경우 malloc 만 사용합니다.

코드는 정확하지만 동적으로 메모리를 할당 할 수는 없습니다. node.date에 측정 된 값을 저장하고 알 수없는 경우 얼마나 많은 측정 값을 캡처 할 것입니까? 그렇다면 당신은 당신이 취하는 각각의 측정에서 새로운 기억을 몇 가지 malloc해야합니다.

런타임 전에 (코드에서 직접) 모든 노드를 정의하면 이전에 정의한 것보다 많은 측정 값을 저장할 수 없습니다.

c의 링크 된 목록을 검색하면 좋은 예제가 있습니다.

0

데이터 유형이 트리의 노드처럼 보입니다. 트리 노드 할당에 대한 malloc을 사용하는 두 가지 주된 이유는

  1. 노드의 임의의 수를 할당하는 것입니다. 트리 노드의 수는 일반적으로 런타임 값이됩니다. 모든 로컬 변수는 컴파일 타임에 선언해야하므로 이러한 노드에 적절한 수의 로컬 변수를 선언하는 것은 불가능합니다. 한편, malloc은 원하는만큼 많은 노드 객체를 할당하면서 원하는만큼 런타임에 런타임에 호출 될 수 있습니다.

  2. 로컬 객체의 수명이 끝날 때 (즉 블록의 끝) 노드가 자동으로 삭제되지 않도록합니다. malloc에 의해 할당 된 객체는 을 호출하여 명시 적으로 삭제할 때까지 (영원히 )입니다. 이러한 객체는 블록 경계와 함수 경계를 초월합니다. 로컬 객체는 블록의 끝에서 자동으로 소멸되므로 로컬 객체를 사용하는 것은 불가능합니다.

코드 샘플은 실제 할당량이 실제로 실제 트리를 만들기 때문에 동적 할당의 이점에 의존하지 않습니다. 방금 단일 노드로 선언되었습니다. 그러나 실행중인 노드 수의 전체 트리를 만들려고하면 노드를 로컬 객체로 선언하여 불가능하다는 것을 즉시 알 수 있습니다. 어쩔 수없이 malloc을 사용하여 노드를 할당해야합니다.

"메모리 위치에 초기화되지 않은 n1이 데이터를 저장할 수있는 방법"이라는 질문은 혼동으로 인해 야합니다. struct node n1;정의 인 개체입니다. 즉, n1의 메모리 위치를 지정합니다. 이것이 바로 객체 정의의 목적입니다.

관련 문제