Con trỏ treo (Dangling pointer)
Con trỏ treo là con trỏ trỏ đến vị trí bộ nhớ đã được giải phóng (hoặc xóa). Có nhiều cách khiến con trỏ trở thành treo:
Gọi hàm
Con trỏ trỏ đến biến cục bộ trở thành treo khi biến cục bộ không phải static.
int *show(void) {
int n = 76; /* ... */
return &n;
}
Kết quả
Kết quả chương trình sẽ là địa chỉ rác.
Giải phóng bộ nhớ
#include <stdlib.h>
#include <stdio.h>
int main() {
float *p = (float *)malloc(sizeof(float));
// cấp phát động
free(p);
// sau free() p thành con trỏ treo
p = NULL;
// giờ p không còn treo
}
Biến ra khỏi phạm vi
int main() {
int *p //mã gì đó//
{
int c; p=&c;
}
//mã gì đó//
//p là con trỏ treo ở đây.
}
Con trỏ void (Void pointer)
Con trỏ void trong C là con trỏ không liên kết với bất kỳ kiểu dữ liệu nào. Nó trỏ đến vị trí dữ liệu trong bộ nhớ, tức là địa chỉ của biến. Còn gọi là con trỏ đa năng.
Có một số hạn chế:
- Không thể thực hiện toán tử con trỏ trên void pointer do kích thước cụ thể.
- Không thể sử dụng như giải tham chiếu.
Ví dụ đơn giản
#include<stdlib.h>
int main() {
int a = 7;
float b = 7.6;
void *p;
p = &a;
printf("Integer variable is = %d", *( (int*) p) );
p = &b;
printf("\nFloat variable is = %f", *( (float*) p) );
return 0;
}
Kết quả
Integer variable is = 7 Float variable is = 7.600000
Thuật toán
Begin
Khởi tạo biến a kiểu int và b kiểu float.
Khai báo con trỏ void p.
(int*)p = ép kiểu void.
p = &b nghĩa là con trỏ void p giờ là float.
(float*)p = ép kiểu void.
In giá trị.
End.
Con trỏ Null (Null Pointer)
Con trỏ null là con trỏ không trỏ đến đâu. Một số dùng:
- Khởi tạo biến con trỏ khi chưa gán địa chỉ bộ nhớ hợp lệ.
- Truyền con trỏ null cho đối số hàm nếu không muốn truyền địa chỉ hợp lệ.
- Kiểm tra con trỏ null trước khi truy cập biến con trỏ. Để xử lý lỗi, ví dụ: chỉ giải tham chiếu nếu không NULL.
Ví dụ
#include<iostream>
#include <stdio.h>
int main() {
int *p= NULL;//khởi tạo con trỏ null
printf("The value of pointer is %u",p);
return 0;
}
Kết quả
The value of pointer is 0.
Con trỏ Wild (Wild Pointer)
Con trỏ wild là con trỏ trỏ đến vị trí bộ nhớ tùy ý (không phải NULL).
int main() {
int *ptr; // wild pointer
*ptr = 5;
}