1. 程式人生 > >C程式碼開發遇到的問題 變數初始化和結構體指標移動

C程式碼開發遇到的問題 變數初始化和結構體指標移動

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語言基礎沒掌握好 。後人哀之而鑑之。