연결 목록의 노드에 대한 동적 메모리 할당
이유는 무엇 또한으로 메모리를 할당 할 필요가 노드 (머리)에 대한 포인터를 선언해야 할 때 malloc
또는 calloc
그것을 위해? 목록을 생성하는 코드 (여기에서 가져 오지 않음)가 메모리를 할당하지 않고 node *head
.
typedef struct str_node{
int data;
struct str_node *next;
}node;
int main(){
node *head;
head = (node*) malloc(sizeof(node));
head = NULL;
그리고 위와 같이 메모리를 할당 할 때 왜 써야 (node*)
합니까? 내가 머리에서하고 있기 때문에 이미 구조체 노드에 할당되지 않았습니까? 그 코드 줄의 의미는 정확히 무엇입니까? 또한 내가 쓸 때 head = NULL
포인터 헤드의 주소를 NULL 또는 무엇으로 설정합니까?
답변
이 코드 조각
node *head;
head = (node*) malloc(sizeof(node));
head = NULL;
메모리 누수가 발생합니다.
처음에는 유형의 객체에 대한 메모리 node
가 할당되고 해당 주소가 포인터에 할당되었습니다.head
head = (node*) malloc(sizeof(node));
그런 다음 즉시 포인터 값을 덮어 썼습니다.
head = NULL;
결과적으로 할당 된 메모리의 주소가 손실되고 할당 된 메모리를 해제 할 수 없습니다.
코드 조각은 의미가 없습니다. 쓰기로 충분할 것입니다
node *head = NULL;
이 경우 처음에는 빈 목록이 있습니다.
그리고 위와 같이 메모리를 할당 할 때 왜 (node *)를 써야합니까?
이 함수 malloc
는 유형의 포인터를 반환합니다 void *
. 유형 void *
의 포인터는 다른 개체 유형의 포인터에 할당 될 수 있습니다. 따라서 C에서는 캐스팅이 중복됩니다.
C ++에서는 void *
형식의 포인터 void *
가 할당 된 개체 포인터의 형식으로 형식의 포인터를 명시 적으로 캐스팅 해야합니다 .
또한 head = NULL이라고 쓸 때 포인터 헤드의 주소를 NULL로 설정합니까?
포인터 자체의 주소를 설정하지 않았습니다. 포인터는 컴파일러에 의해 할당되었으며 자동 저장 기간이 있습니다. head
유형 node *
이 NULL 인 변수의 값을 설정합니다 .
C에서 포인터는 정수처럼 값입니다. 당신이 쓸 때 :
int a;
a = 3;
값 3을 변수에 저장합니다 a
.
당신이 쓸 때 :
int* p;
p = NULL;
값 NULL
을 변수에 저장합니다 p
. 포인터에는 특별한 것이 없습니다. 할당은 어떤 식 으로든의 값에 의존하지 않습니다 p
. (이 경우에는 아무것도 가리 키지 않지만 관련이 없습니다.)
malloc
위에서 논의한대로 값인 메모리 영역에 대한 포인터를 반환합니다. 포인터에는 고유 메타 데이터가 없습니다. malloc
메모리 영역의 크기를 초과하는 정보는 필요하지 않습니다. 특히 메모리 영역이 어떤 용도로 사용 될지 알지 못합니다. 해당 값이 생성되면 다음과 같이 적합하다고 판단되는대로 처리 할 수 있습니다.
int* p;
p = malloc(sizeof *p);
p
가에 대한 포인터로 선언 되었기 때문에 int
에 의해 가리키는 메모리 p
는 int
. (아직은 아니지만 가능합니다.) 그러나 포인터가 가리키는 메모리에 저장된 정수 (있는 경우)에 영향을주지 않고 포인터를 값으로 전달할 수 있습니다. 예를 들어,
int* q = p;
q
와 p
같은 메모리 가리.
이 중 하나라도 혼란 스럽다면 포인터가 단순한 값이 아닌 다른 값을 기대하기 때문일 것입니다. 그러나 그것들은 단순한 가치이고 여러분은 그 단순한 현실을 기반으로하는 멘탈 모델이 필요합니다.