c/c++中指標的運用十分頻繁,且極其容易出錯,一旦出現引用空指標或指標未釋放都可能引起程式的bug。其中,指標的指標這一概念更是不好理解,在這裡記錄一下指標一些問題的測試,便於將來查閱。
測試1測試2
首先定義乙個void型指標p,將指標指向null:
void *p = null;
接著定義乙個指標的指標pp,指向指標p:
void *pp = &p;
於是,這裡可以看出指標p的值應該為其指向的變數null的位址,由於此時p為空指標,因此若使用*p這會導致編譯報錯,因為使用了空指標;同理,此時指標pp的值為變數p的位址,而 *pp為變數p的值,應該為null,如下語句測試:
cout << "p " << p << " " << "pp " << pp << endl;
cout << "*pp " << *pp << endl;
結果如下:
p 00000000 pp 00f7fc1c
pp 00000000
可以看出,雖然p變數指向null,但是p的位址值是實際存在的。
定義乙個結構體:
typedef struct _test_y_test, *ptest;
然後,定義乙個指標phandle:
void *phandle = null;
接著為該指標分配記憶體:
phandle = (void*)malloc(sizeof(test));
ptest ptest = (ptest)phandle;
這裡,為指標phandle分配記憶體是必須的,如果沒有為phandle分配記憶體,直接將ptest指向phandle指向的位置,那麼ptest也是null,這時對ptest作如下操作就會出現異常:
ptest->a = 10;
ptest->c = 100;
在對phandle指標分配記憶體之後上面兩行**已經沒有問題了,但是對變數b的賦值依然存在問題:
ptest->b = "ssss";
上面的**會出現異常;
如果,修改test結構體的定義,把成員變數b改為乙個陣列變數,如下:
#define max 10
typedef struct _test_y_test, *ptest;
然後,對b的賦值修改為:
ptest->b[5] = 1;
這樣就不會報錯,這是什麼原因呢?
其實,是因為當結構體變數中成員量b為string型別時,由於string是乙個類,而在對類的變數賦值時應該呼叫類的建構函式,而直接將"ssss"賦值給b沒有呼叫這個過程,因此就會報錯;那麼這個問題該如何解決:
採用new的方法新建test變數;
使用 placement new 操作符,貌似比較複雜,不介紹…(因為我也沒細看-_-||)
C 知識記錄1
3.malloc和new 1.malloc與free是c c語言的標準庫函式,new delete是c 的運算子。但它們都可用於申請動態記憶體和釋放記憶體。2.對於非內部資料型別的物件而言,用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構...
雜碎知識記錄
清除客戶端快取 response.cache.setcacheability httpcacheability.nocache 絕對過期快取 向 cache 中插入具有依賴項和過期策略的物件。引數key用於引用該物件的快取鍵。value 要插入快取中的物件。dependencies 所插入物件的檔案...
小知識記錄
清除浮動 新增子元素,左右都不允許出現浮動元素。清除a的下劃線 text decoration none 清除li前的小圓點 li 聖杯布局 negative margin 關於文件流,浮動流和position input標籤的型別 color,date,email 可使用偽類 或 元素。style...