30/09/2018, 17:01

Không thể giải phóng được con trỏ?

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main(){
	int a = 10;
	int *p1=&a;
	int *p2 = (int *)malloc(sizeof (int));
   	p2 = p1;
	*p2 = 12;
	printf("%d %d %d", *p1, *p2, a);
	free(p2);
	_getch();
	return 0;
}

Sao Không Giải Phóng Được Con Trỏ p2 Vậy.

... viết 19:02 ngày 30/09/2018

Con trỏ p2 đang kiểm soát vùng nhớ được cấp phát bằng malloc bằng cách giữ địa chỉ đầu tiên của vùng nhớ đó.
Ngay khi bạn gán p2 = p1. Bạn đã bị memory leak. Vùng nhớ bạn cấp phát cho p2 giờ ai quản lý?

p2 = p1; //p1 có cấp phát đâu mà giải phóng

Có cần đặt tiêu đề ra vẻ nghiêm trọng vậy không?
Hoan Sò viết 19:03 ngày 30/09/2018

thế cho mình hỏi sao khi thay đổi p2 thì tất cả đều thay đổi vậy

... viết 19:16 ngày 30/09/2018

Mình trả lời bạn cũng cần đọc đâu.

Hoan Sò viết 19:09 ngày 30/09/2018

đâu mình k thấy, mình muốn hỏi là tại sao khi gán *p2=12; thì tất cả đều thay đổi kể cả a…

... viết 19:16 ngày 30/09/2018

Vì trước đó bạn gán tham chiếu của a cho p2. Tìm lại bài tham chiếu của anh @ltd coi lại là hiểu.

Sáng Béo viết 19:04 ngày 30/09/2018

mình muốn hỏi là tại sao khi gán *p2=12; thì tất cả đều thay đổi kể cả a…

p1 giữ địa chỉ của a, p2 lấy giá trị của p1 => p2 cũng giữ địa chỉ của a.
*p1, *p2 thực chất là a.
*p2=12 <=> a=12 -> giá trị của a thay đổi -> toàn bộ thay đổi.

Bài liên quan
0