01/10/2018, 08:44

Xin hỏi bài về con trỏ trong cấu trúc

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("
 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!

Trần Hoàn viết 10:49 ngày 01/10/2018

Đầ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ể

rogp10 viết 10:51 ngày 01/10/2018

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

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

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.

Người bí ẩn viết 10:45 ngày 01/10/2018
SDiem2D d1, *d2;

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

*d1.p = 15;

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 = (SDiem2D*)malloc(sizeof(d2));

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.

Trần Hoàn viết 10:46 ngày 01/10/2018

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ì

rogp10 viết 10:45 ngày 01/10/2018

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

Văn Dương viết 10:49 ngày 01/10/2018

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

Trần Hoàn viết 10:59 ngày 01/10/2018

à, 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 =))

Văn Dương viết 10:46 ngày 01/10/2018

À 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.

Bài liên quan
0