C 언어 포인터에 대한 질문

2569 단어 C 언어
C 언어 포인터에 대해 학습할 때 다음과 같은 질문을 발견했습니다.
#include<stdio.h>

#include<stdlib.h>

#include<string.h>



struct A{

    int a;

    char b;

};



struct B{

    struct A *n;

};

struct B *new_B(){

    struct A t = { 100, 'c'};

    struct B *p;

    p = (struct B *) malloc(sizeof(struct B));

    p->n = &t;

    return p;

}

int main(void) {

    struct B *p;

    p = new_B();

    printf("%d, %c
", p->n->a, p->n->b); free(p); return 0; }

함수 newB의 역할은 구조체 B의 바늘 변수 p를 새로 만들고 메모리를 분배한 다음에 함수에 구조체 A의 변수 t를 만들고 이 변수의 주소 & t를 B의 구성원 n(n은 구조체 A의 바늘)에게 부여하는 것이다.우리는 t가 국부 변수로 창고에 저장되고 함수 new 에 저장된다는 것을 안다B 집행이 끝나면 t는 석방된다.우리가 주 함수를 되돌려 출력하면 정확한 결과를 얻을 수 있다.만약 우리가 메모리를 분배하는 줄, 즉 p=(struct B*)malloc(sizeof(struct B))를 제거한다면;집행이 잘못될 것이다.
문제는 메모리를 분배해도 newB 함수가 실행된 후에 t는 방출됩니다. 그러면 주 함수에서 p->n에 접근하면 오류가 발생할 수 있습니다.왜 주 함수에서 접근할 수 있습니까? 
큰 소가 해답을 가르쳐 주세요!!!
 

좋은 웹페이지 즐겨찾기