在c語言中,遇到的奇奇怪怪的問題彙總,開發工具為:vs2019
在非main.cpp即主模組中使用到了malloc()函式,但未在模組中引入庫
由於malloc()函式,其是庫中的內容,若不引入庫,將無法動態分配記憶體,
就會導致動態記憶體分配失敗,變數《無法讀取記憶體》
在利用結構體作為引數時,要注意如果使用不當,在呼叫init()初始化函式結果不一定會影響到外面的變數,這就導致了外面的變數實際上,並未得到初始化,而在接下來的使用中,就有可能發生記憶體衝突異常,這個時候就要注意看看自己這個位置的變數,是否得到了初始化.
一般來講,我們會把初始化結構體的**提取出來,封裝到init()函式中,而通過將結構體變數作為函式引數來完成初始化,但有的時候比如,結構體變數作為引數,在初始化函式中用malloc動態分配記憶體,這樣的行為不能完成外面的變數初始化.這就有可能導致2.中的問題.
那麼有關結構體變數作為函式引數的應用,就需要做乙個總結.由於不同的嘗試篇幅過大,我就單獨做出乙個文件.
c語言結構體作為函式引數初始化
在乙個儲存了樹節點的棧中,我想獲取其棧內某一變數的位址,並通過指標變數返回該位址,然後對該指標變數資料修改,按道理講,如果指標變數獲取到了棧內變數位址,那麼對該指標變數資料修改也就會影響到棧內變數的資料修改.
在獲取棧內變數位址這一操作時,我覺得並不需要對其棧修改,而只要用二級指標,將其變數位址返回就行,但發現在返回後,對其指標變數修改時,並未影響到棧內變數的資料,這意味著僅僅是拷貝了值,而沒有真正返回其位址.
然後我將棧變數,改為棧指標作為引數,同樣的二級指標獲取其棧內變數位址,返回後繼續執行修改資料的**,竟然發現隨著指標變數資料修改,棧內變數也發生了變化.
我們來對比下:
成功的方式:
失敗的方式:
問題所以,及解決方法在這個文件中
對於這樣未初始化的指標,如何判斷還未初始化呢?
通過實驗直接用null 的方式是行不通的,因為在定義後,其值是隨機分配的,於是,可以先定義其值為null,然後再作這樣的判斷是可以的.
C語言學習
c語言學習 2013 3 26 1 編寫strcat s,t 函式,功能 將t指向的字串複製到s指向的字串的尾部。程式設計思路 1 通過while迴圈找到字串s的結束符。2 從找到的結束符開始將t複製到s,同時移動二者的指標。2 編寫函式strend s,t 如果字串t出現在字串s的尾部,該函式返回...
c語言學習
今天總結一些c 語言方面的知識 變數的概念 其值在作用域內可以改變的量稱為變數。乙個變數應該有乙個名字,並在記憶體中佔據一定儲存空間。區域性變數和全域性變數 區域性變數是在函式內作定義說明的,其作用域僅限函式內,離開該函式再使用這種變數是非法的。全域性變數也稱為外部變數,是在函式外部定義的變數,它不...
c語言學習
計算機工作基本原理 現代計算機可分為幾個部件 cpu 處理單元 擔負著絕大部分的計算工作。ram 隨機訪問儲存器 作為乙個工作區來儲存程式和檔案。硬碟 永久儲存器 即使在計算機關機時也能記下程式和檔案。以及各種外圍裝置 如鍵盤,滑鼠和監視器 用來提供人與計算器之間的通訊。cpu工作過程 從記憶體中獲...