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!
Bài liên quan
Đầ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ớ chod2
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à đủ
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.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ấysizeof(d2)
? Và như đã nói ở trên, chưa typedef choSDiem2D
thì nên để từ khoá struct ở đằng trước:Và code của bạn đã chạy bình thường.
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ì
Người ta viết
p->a
thay cho(*p).a
, vậy*p.a
nghĩa là*(p.a)
thôiXử lý ảnh là đụng tới unsafe liền
à, 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.