1. 程式人生 > >c語言==野指標形成原理、造成的危害及避免方法(22)

c語言==野指標形成原理、造成的危害及避免方法(22)

野指標 : 隨機指向一塊記憶體的指標成為野指標。(因為在計算機中,記憶體的分配由作業系統來管理,要使用記憶體需要先向作業系統申請,系統分配後才可以使用,而野指標的記憶體空間是隨機分配的,屬於非法訪問記憶體。)
野指標造成的錯誤叫做記憶體洩漏,但存在野指標並不一定每次執行程式都會出現段錯誤,因為可能某次給野指標隨機分配的記憶體地址是其它變數已經申請過的記憶體地址,這種情況不會出現段錯誤。
怎樣避免野指標 :要養成良好的編碼習慣 。
1、定義指標時如果沒有初始化,就讓它指向NULL,置為空的指標,不能給這個指標所指向的空間做操作。(因為NULL是一個零地址,系統規定不可以對零地址進行操作。其實置為空是無法徹底避免野指標的,置為空只是提醒程式設計者該指標是野指標,不可以對其進行賦值或其他操作。)
2、當要向一個指標指向的空間賦值時,一定要檢查有沒有給這個指標分配空間。方法如下:
int* p = malloc(size of (int))
if(p == NULL)
{
printf(“malloc error!\n”);
exit(1);//跳出整個程式
}

        /*這裡要說明一下為什麼賦值的不是int資料型別的位元組長度4。因為在不同平臺上,整型的位元組長度可能不一樣,如果分配的是4,那麼當程式在其他平臺執行時,整形資料長度可能就不是四個位元組,會帶來不必要的麻煩。以這種方式寫可以保證無論在什麼平臺分配的都是整型資料的位元組長度,從而提高了程式碼的移植性。*/
3、當給一個指標分配空間時,要檢查下有沒有分配空間。
4、將分配的記憶體空間初始化。因為如果不進行初始化可能會有之前的垃圾資料殘留,影響程式。可以用memset(p,0,sizeof(int));memset會將p指向的前sizeof(int)空間都置為0。
5、用完後把記憶體還給系統(釋放)
6、釋放完後再將指標指向NULL,否則p會再次成為野指標。
#define NULL (void *)0   //NULL指向零地址,不允許對0地址對應的空間做操作。

malloc()函式,形參為要分配的位元組大小,返回為這段空間的首地址。
eg : malloc(4)和malloc(sizeof(int)) 後者提高了移植性。
memset(p,0,sizeof(int)) 把p指向的空間全部初始化為0
free(p)釋放。

相關推薦

c語言==指標形成原理造成危害避免方法22

野指標 : 隨機指向一塊記憶體的指標成為野指標。(因為在計算機中,記憶體的分配由作業系統來管理,要使用記憶體需要先向作業系統申請,系統分配後才可以使用,而野指標的記憶體空間是隨機分配的,屬於非法訪問記憶體。) 野指標造成的錯誤叫做記憶體洩漏,但存在

【進階3-4期】深度解析bind原理使用場景模擬實現

這是我在公眾號(高階前端進階)看到的文章,現在做筆記  https://github.com/yygmind/blog/issues/23 bind() bind() 方法會建立一個新函式,當這個新函式被呼叫時,它的 this 值是傳遞給 bind(

C語言為四維陣列申請動態記憶體空間的方法

嘗試了用堆疊的方式為四維陣列申請動態記憶體空間,並將申請記憶體的操作封裝成了子函式,方便在主程式中使用。希望對大家有用。程式碼如下: #include <stdio.h> #include <stdlib.h> float****

kafka入門:簡介使用場景設計原理主要配置叢集搭建

問題導讀: 1.zookeeper在kafka的作用是什麼? 2.kafka中幾乎不允許對訊息進行“隨機讀寫”的原因是什麼? 3.kafka叢集consumer和producer狀態資訊是如何儲存的? 4.partitions設計的目的的根本原因是什麼? 一、入門     1、簡介  

C語言為四維陣列申請動態記憶體空間的方法

嘗試了用結構體為四維陣列申請動態記憶體空間,希望對大家有用。程式碼如下: #include <stdio.h> #include <stdlib.h> typedef struct _a{ float *dat; }A;

C語言指標產生的原因解決方法

C語言野指標產生的原因及解決方法 情況一 原因 指標變數宣告時沒有被初始化。 解決辦法 指標宣告時初始化,可以是具體的地址值,也可讓它指向NULL。 情況二 原因 指標 p 被 free 或者 delete 之後,沒有置為 NULL。 解決辦法 指標指向的記憶體空間被

C語言學習——指標與陣列指標

指標與陣列 方法1 方法2 小案例 空指標 指標與陣列 陣列的元素在記憶體中是互連的,通過指標運算元組某個元素 方法1 int vals[4]={1,2,3

C語言指標的產生原因避免辦法

見如下程式例項:#include <stdio.h> #include <stdlib.h> int main() { char *p1 = NULL; printf("

C語言中存儲類別又分為四類:自動auto靜態static寄存器的register和外部的extern

字符變量 修飾 例如 register ext 進行 適合 sta -- 除法運算中註意: 如果相除的兩個數都是整數的話,則結果也為整數,小數部分省略,如8/3 = 2;而兩數中有一個為小數,結果則為小數,如:9.0/2 = 4.500000。 取余運算中註意: 該運算只適

朱有鵬C語言高階---4.9.11--雙鏈表--遍歷節點11

朱有鵬C語言高階---4.9.11--雙鏈表--遍歷節點(11)   遍歷節點 (1)雙鏈表是單鏈表的一個父集。雙鏈表中如何完全無視pPrev指標,則雙鏈表就變成了單鏈表。這就決定了雙鏈表的正向遍歷(後向遍歷)和單鏈表是完全相同的。 (2)雙鏈表中因為多了pPrev指標,因

朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現9

朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現(9)   單鏈表的侷限性 (1)單鏈表是對陣列的一個擴充套件,解決了陣列的大小比較死板不容易擴充套件的問題。使用堆記憶體來儲存資料,將資料分散到各個節點之間,其各個節點在記憶體中可以不相連,節點之間通過指標進行單向連線。

shell命令以及執行原理檢視或修改掩碼umaskLinux許可權管理Linux設定檔案訪問許可權chmod粘滯位修改檔案的擁有者chown修改檔案的所屬組chgrp

shell命令以及執行原理:   Linux嚴格意義上說的是一個作業系統,我們稱之為”核心”,但是我們普通使用者,不能直接使用核心,而是通過核心的”外殼”程式,也就是所謂的shell,來與核心溝通。   Linux中的命令大多數都是可執行程式。但其實捕捉我們

HDFS應用場景原理基本架構使用方法概述

以下主要參考小象科技的董西成老師的視訊 1. HDFS概述 2. HDFS基本架構和原理 3. HDFS程式設計 4. HDFS 2.0新特性 一、HDFS概述 HDFS是什麼? 1、源自於Google的GFS論文,發表於2003年10月,HDFS是GFS克隆版

c語言==字元陣列與字串,char的取值範圍1

求char型別陣列的strlen長度 昨天老師給了一道題目 #include <stdio.h> #include "string.h" int main() { int i; char a[1000]; fo

FrameBuffer 原理實現與應用 寫屏

一、FrameBuffer 原理、實現與應用  一、FrameBuffer的原理    FrameBuffer 是出現在 2.2.xx 核心當中的一種驅動程式介面。    Linux是工作在保護模式下,所以使用者態程序是無法象DOS那樣使用顯示卡BIOS裡提供的中斷呼叫來實

C語言實現斐波那契數列的兩種方法遞迴和迭代)

兩種方法實現斐波那契數列,遞迴實現起來稍簡單些,思路也清晰些,但執行效率顯然不如迭代 下面是編譯通過的兩種方式實現斐波那契數列的C語言程式碼:/* * fibanacci.c * * Created on: 2015-3-16 * Author: flo

Apollo架構體系Apollo執行原理Apollo配置中心簡單介紹

筆者在工作中遇到如下問題,隨著程式功能越多,配置檔案不斷增加,一些功能的開關、伺服器地址、介面地址、不同環境的一些配置檔案不同,這些在每次釋出不同環境、更新專案時都比較繁瑣,後來學習微服務時接觸到了Spring Cloud Config配置中心,用了一段時間發現比之前方便不少,但是還是比較繁瑣和麻煩

網頁驗證碼的基本原理常見漏洞解決方法

    前些天查了一些驗證碼的資料,瞭解了一些資訊,也發現了一些網站確實存在的漏洞。下文將分析驗證碼原理及存在的問題。首先宣告:本文僅僅探討技術,請各位讀者不要利用這些資訊進行非法行為,筆者不承擔任何連帶責任!當然,筆者能力有限,這裡也提供不了什麼實質性技術,只是將自己獲取的

殭屍程序的產生危害避免方法

1.殭屍程序:前文已經對殭屍程序的定義進行了說明。那麼defunct程序只是在process table(程序表項)裡有一個記錄,其他的資源沒有佔用,除非你的系統的process個數已經快超過限制了,

C語言指標連結串列的原理和各類操作

一、指標 1、運用指標         什麼是指標?什麼是記憶體地址?什麼叫做指標的取值?指標是一個儲存計算機記憶體地址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數地址,例如int、long和double。指標也可以