Code con trỏ trong cấu trúc bị warning về giải phóng con trỏ

Dạ chào các anh,chị!
Cho em hỏi bài sau :

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

struct SDiem2D
{
	int m_nX;
	int m_nY;
	int *p;
};


int main()
{
	SDiem2D d1, *d2;
	d1.m_nX = 12;
	d1.m_nY = 4;
	d1.p = (int*)malloc(sizeof(int));
	*d1.p = 15;
	d2 = (SDiem2D*)malloc(sizeof(d2));
	
	d2->p = (int*)malloc(sizeof(int));
	d2->m_nX = d1.m_nX;
	d2->m_nY = d1.m_nY;
	*(d2->p) = *d1.p;
	printf("\n D(%d,%d,%d)", d2->m_nX, d2->m_nY, *(d2->p));

	free(d1.p);
	free(d2->p);
	free(d2);
	getch();
	return 0;
}

tuy chạy được nhưng lại có thông báo “cảnh báo”(VS 2010). Chỉ khi bỏ giải phóng con trỏ thì chương trình mới chạy bình thường.Xin cho em hỏi chương trình trên bị gì? Xin cảm ơn!

Đầu tiên, chương trình cảnh báo không được dùng getch() mà phải dùng hàm an toàn _getch()

Sau đó, khi minh debug thì lỗi xảy ra ở dòng free(d2) => không thể giải phóng bộ nhớ cho d2

Dù có thay đổi thứ tự các lệnh free thì vẫn lỗi ở d2, mình không hiểu sao, cầu cho bạn có cao nhân vào giúp chứ mình thấy code rất OK, search _CrtIsValidHeapPointer(pUserdata) thì không thu được gì đáng kể

Tiêu ở câu này. d2 là một con trỏ thì làm sao mà đủ :slight_smile:

Còn vì sao khi free() mới có lỗi runtime thì rất có thể là lúc đó debug mode mới kiểm tra xem có ghi lấn ra ngoài không.

1 Like

Nên để là struct SDiem2D d1, *d2; nhé.

Nếu không biết rõ độ ưu tiên của các toán tử mà để như vậy thì nguy hiểm lắm, và sau này có đọc lại cũng chưa chắc hiểu rõ. *(d1.p) = 15 sẽ tốt hơn. Còn nếu nắm vững rồi thì cứ mà … quẩy thôi !

d2 là con trỏ cấu trúc có datatype là SDiem2D thì sao lại lấy sizeof(d2) ? Và như đã nói ở trên, chưa typedef cho SDiem2D thì nên để từ khoá struct ở đằng trước:

d2 = (struct SDiem2D *)malloc(sizeof(struct SDiem2D));

Và code của bạn đã chạy bình thường.

1 Like

Mình học C#, không bao giờ đụng đến unsafe code nên nhìn mấy thím ở trên giảng chả hiểu moẹ gì :stuck_out_tongue:

Người ta viết p->a thay cho (*p).a, vậy *p.a nghĩa là *(p.a) thôi :smiley:

2 Likes

Xử lý ảnh là đụng tới unsafe liền :smiley:

à, có lần phải làm đề tài nhận diện chữ in, thế là bê engine của google nhét vào thôi, chả cần unsafe =))

À dùng thư viện thì không cần. Nhưng tự phát triển thuật toán riêng đụng tới dữ liệu nguyên bản thì mới cần.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?