C C 結構體常見錯誤

2021-07-05 23:30:13 字數 1247 閱讀 6763

之前在c語言結構體常見使用方法已經說過結構體其實是對一塊空間的劃分與使用,那麼無論怎麼折騰怎麼改,都是這一畝三分地,只要找到相應位址,直接改也不奇怪(c的一大核心就是指標和位址)。

1.字串覆蓋其他成員:

簡而言之,寫入的字串超出了長度,導致後邊的成員被覆蓋。

例如這種結構體和操作:

#include #include typedef structs;

main()

結果如下

[root@j struct]# gcc array.c 

[root@j struct]# ./a.out

itest: 0xbfbebc64:6

iparam: 0xbfbebc7c:5

pcarray: 0xbfbebc68:hello world,hello world

itest: 0xbfbebc64:6

iparam: 0xbfbebc7c:6581362

因為字串的超界操作,iparam已經被修改

關於結構體內部巢狀結構體,有以下兩種寫法容易產生混淆:

#includeusing namespace std;

struct ss1aa;

int c;

}ss1;

struct ss2;

int c;

}ss2;

int main()

前者是在結構體ss1中宣告並定義了乙個aa結構體物件aa,後者只是對結構體型別aa進行了宣告,實際不包含,所以ss1與ss2大小不同,差12bytes。

因為派生類空間是在基類部分後邊追加的,且互相不侵犯,等於另起爐灶,所以發生派生時,對齊不可優化。

32位,#pragma pack(4),正常情況下(如果前後是正常的,本例前是4bytes的int a,所以是正常對齊的),兩個連續宣告的char b和char c只占用2bytes(如果後邊是個short),考慮到後邊的int d,也只不過占用4bytes。但是發生繼承時,就不能這樣算了:

#includeusing namespace std;

struct a;

struct b:a;

int main()

中間兩個char型別b和c看起來「連著」,實際上因為分屬不同的「類部分」所以分別占用4bytes空間,最後b的大小是24,而不是20。

C C 常見指標錯誤

1 記憶體分配未成功,卻使用了它。程式設計新手常犯這種錯誤,因為他們沒有意識到記憶體分配會不成功。常用解決辦法是,在使用記憶體之前檢查指標是否為null。如果指標p是函式的引數,那麼在函式的入口處用assert p null 進行檢查。如果是用malloc或new來申請記憶體,應該用if p nul...

C C 常見錯誤彙總

筆記本 macbook air,作業系統 macos,ide clion,工具鏈如下圖 出錯原因 片段沒有寫在函式中。解決方法 將 片段寫進函式中。出錯原因 main.cpp中沒有找到對應的函式名宣告,沒有在.cpp引用包含該函式名的標頭檔案.h。解決方法 引入對應標頭檔案。出錯原因 main.cp...

c c結構體陣列 結構體指標

結構體中自己常常弄不清的。兩個常用的結構體陣列 結構體指標 將自定義的結構體放入到陣列中方便維護 語法 語法 struct 結構體名 陣列名 元素個數 舉例 struct student intmain for int i 0 i 3 i 2 結構體指標 顧名思義就是指向結構體的乙個指標 通過指標訪...