Computer >> Máy Tính >  >> Lập trình >> C ++

Dangling, Void, Null và Wild Pointers trong C ++

Con trỏ nguy hiểm

Con trỏ nguy hiểm là một con trỏ trỏ đến vị trí bộ nhớ đã được giải phóng (hoặc xóa). Có nhiều cách khác nhau trong đó Pointer hoạt động như một con trỏ treo

Lệnh gọi hàm

Con trỏ trỏ đến biến cục bộ sẽ bị treo khi biến cục bộ không tĩnh.

int *show(void) {
   int n = 76; /* ... */ return &n;
}

Đầu ra

Output of this program will be garbage address.

Khử cấp phát bộ nhớ

int main() {
   float *p = (float *)malloc(sizeof(float));
   //dynamic memory allocation.
   free(p);
   //after calling free()
   p becomes a dangling pointer p = NULL;
   //now p no more a dangling pointer.
}

Biến vượt ra ngoài phạm vi

int main() {
   int *p //some code// {
      int c; p=&c;
   }
   //some code//
   //p is dangling pointer here.
}

Con trỏ trống

Con trỏ Void là một con trỏ không liên kết với bất kỳ kiểu dữ liệu nào. Nó trỏ đến một số vị trí dữ liệu trong bộ nhớ có nghĩa là trỏ đến địa chỉ của các biến. Nó còn được gọi là con trỏ mục đích chung.

Nó có một số hạn chế

  • Con trỏ void không thể tính toán được do kích thước cụ thể của nó.
  • Nó không thể được sử dụng như là tham chiếu.

Ví dụ

#include<stdlib.h>
#include<iostream>
using namespace std;
int main() {
   int a = 7;
   float b = 7.6;
   void *p;
   p = &a;
   cout<<*( (int*) p)<<endl ;
   p = &b;
   cout<< *( (float*) p) ;
   return 0;
}

Đầu ra

7
7.600000

Thuật toán

Begin
   Initialize a variable a with integer value and variable b with float value.
   Declare a void pointer p.
   (int*)p = type casting of void.
   p = &b mean void pointer p is now float.
   (float*)p = type casting of void.
   Print the value.
End.

Con trỏ rỗng

Con trỏ rỗng là một con trỏ không trỏ gì cả.

Một số cách sử dụng con trỏ null là

  • Để khởi tạo biến con trỏ khi biến con trỏ đó chưa được gán bất kỳ địa chỉ bộ nhớ hợp lệ nào.

  • Để chuyển một con trỏ null tới một đối số của hàm nếu chúng ta không muốn chuyển bất kỳ địa chỉ bộ nhớ hợp lệ nào.

  • Để kiểm tra con trỏ null trước khi truy cập bất kỳ biến con trỏ nào. Vì vậy, chúng tôi có thể thực hiện xử lý lỗi trong mã liên quan đến con trỏ, ví dụ:biến con trỏ dereference chỉ khi nó không phải là NULL.

Ví dụ

#include <iostream>
using namespace std;
int main() {
   int *p= NULL; //initialize the pointer as null.
   cout<<"The value of pointer is ";
   cout<<p;
   return 0;
}

Đầu ra

The value of pointer is 0.

Con trỏ Wild

Con trỏ Wild là những con trỏ trỏ đến một số vị trí bộ nhớ tùy ý. (thậm chí không NULL)

int main() {
   int *ptr; //wild pointer
   *ptr = 5;
}