C語言空類型中指針和空指針以及野指針的作用是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
void是空類型,void*是空類型指針,又叫萬能指針,就是該指針能接收任意類型的指針,可以指向任何類型對象,所以不能對空類型指針進行解引用,必須強制類型轉換成相應的指針類型,才能進行解引用操作。
空指針類型:
作為函數形參類型,可以接收任意類型的指針;
作為函數返回值類型,在函數外面,將其強制類型轉換為相應的指針類型
可以與另一個void*類型指針比較大小
注意:空類型指針不能進行解引用操作;不能進行±整數運算。
在C語言中,空指針NULL指的是地址為0的那塊空間
#define NULL((void*)0)
對于這塊空間是不準我們進行訪問的,所以,對NULL是不能進行解引用操作的,所以每次對指針進行解引用操作之前,我們要判斷是否為空指針。
野指針是指向一個非法的或已銷毀的內存的指針。
對野指針進行解引用操作是非法的。
int main()
{
char* p;
//此時p是野指針
return 0;
}沒有對指針p進行初始化,此時p就是野指針,如果此時對p進行解引用操作,非法訪問內存,程序就會崩潰。
int main()
{
int arr[] = {1,2,3,4,5};
int* p = arr;
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ",p[i]);
}
return 0;
}雖然上面程序正常運行,但是其實越界訪問了;只是僅僅訪問了非法的內存空間,沒有改變空間的值,程序有可能沒來得及報錯,但并不代表程序沒有錯,但是對于下面的代碼,程序就會崩潰:
int main()
{
int arr[10] = {0};
int i = 0;
int* p = arr;
for (i = 0; i <= 10; i++)
{
*p = i;
p++;
}
return 0;
}因為這里非法訪問內存的同時試圖改變空間的值,所以程序崩潰。
char* fun()
{
char arr[] = "abc";
return arr;
}
int main()
{
char* p = fun();
printf("%s\n",p);
return 0;
}執行程序,給出如下警告

雖然程序沒有崩潰,但是這種寫法是非法的,arr是局部變量,函數調用結束,棧幀銷毀,局部變量空間歸還給操作系統,我們沒有使用權限,此時p就是野指針,*p屬于非法訪問內存。
1.指針要進行初始化
指針要有初始值,初始化為NULL,或者有具體的指向。
既然NULL也不能進行解引用操作,那么為什么可以將指針初始化為NULL?這里初始化為NULL,只是為了給指針一個指向,但是實際使用時,我們并不能對NULL進行解引用操作,所以使用指針之前才要有效性判斷。
2.使用指針之前要進行有效性判斷
使用指針之前,要判斷是否為NULL,如果為NULL,那么是不能進行解引用操作的
3.避免越界訪問
不要進行越界訪問操作,即使還是訪問不改變值也是非法的
4.不要返回局部變量的地址
局部變量空間在函數到調用結束,就歸還給操作系統,如果返回局部變量的地址,函數外面接收該返回值的指針就變成了野指針
5.當指針指向的空間釋放后,要將該指針置為NULL
這樣避免對野指針解引用操作,同時避免二次釋放動態開辟的內存空間
int main()
{
int* p = (int*)malloc(10*sizeof(int));
//1.判斷有效性
if (p == NULL)
{
return -1;
}
//2.使用指針
int i = 0;
for (i = 0; i < 10; i++)
{
p[i] = i;
}
//3.釋放指針指向的空間
free(p);
//free(p);//非法操作
//4.指針置為NULL
p = NULL;
free(p);//釋放空指針什么都不做
return 0;
}看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。