Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Con trỏ treo, void, null và wild trong C/C++


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;
}