C程式碼開發遇到的問題 變數初始化和結構體指標移動
阿新 • • 發佈:2018-11-17
1. 變數初始化
函式內部的變數如果不初始化的話預設不是0而是一個隨機值。
下面的程式用來列印一個未初始化的無符號的整型值,執行幾遍,每次的結果都會不一樣
#include <stdio.h> void PrintUint() { /* 預設是隨機值,不一定是0 */ unsigned int i; if (i != 0) { printf("i = %u \r\n", i); } return; } void main() { unsigned int i,j; printf("start test : \r\n"); for(j = 0; j < 5; j++) { PrintUint(); return; }
2. 結構體指標移動
當不同的資料塊連續儲存時,從一個數據塊結構體指標指向相鄰的不同的資料塊的結構體的時候,
只需要指標值加1,而不是加上當前整個結構體的大小。因為結構體指標的移動單位是當前整個
結構體的大小。
在處理核心網路報文結構體SKB的時候,經常會遇到從一個數據頭指標獲取相鄰的下一個頭域指標,比如說
使用ip_hdr獲取IP頭的時候,如果想要獲取tcp、或者udp的頭域,需要在當前ip的頭指標加1,而不是加上整個IP頭大小。
正確操作:
/* 獲取IP頭指標 */ struct iphdr *iph = ip_hdr(skb); /* 獲取udp/tcp頭指標 */ struct udphdr *udph = iph + 1;
錯誤操作:
/* 獲取IP頭指標 */
struct iphdr *iph = ip_hdr(skb);
/* 獲取udp/tcp頭指標 */
struct udphdr *udph = iph + sizeof(struct iphdr);
一言以蔽之,c語言基礎沒掌握好 。後人哀之而鑑之。