C代码开发遇到的问题 变量初始化和结构体指针移动
生活随笔
收集整理的這篇文章主要介紹了
C代码开发遇到的问题 变量初始化和结构体指针移动
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 變量初始化
函數(shù)內(nèi)部的變量如果不初始化的話(huà)默認(rèn)不是0而是一個(gè)隨機(jī)值。下面的程序用來(lái)打印一個(gè)未初始化的無(wú)符號(hào)的整型值,執(zhí)行幾遍,每次的結(jié)果都會(huì)不一樣
#include <stdio.h>void PrintUint() {/* 默認(rèn)是隨機(jī)值,不一定是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. 結(jié)構(gòu)體指針移動(dòng)
當(dāng)不同的數(shù)據(jù)塊連續(xù)存儲(chǔ)時(shí),從一個(gè)數(shù)據(jù)塊結(jié)構(gòu)體指針指向相鄰的不同的數(shù)據(jù)塊的結(jié)構(gòu)體的時(shí)候, 只需要指針值加1,而不是加上當(dāng)前整個(gè)結(jié)構(gòu)體的大小。因?yàn)榻Y(jié)構(gòu)體指針的移動(dòng)單位是當(dāng)前整個(gè) 結(jié)構(gòu)體的大小。在處理內(nèi)核網(wǎng)絡(luò)報(bào)文結(jié)構(gòu)體SKB的時(shí)候,經(jīng)常會(huì)遇到從一個(gè)數(shù)據(jù)頭指針獲取相鄰的下一個(gè)頭域指針,比如說(shuō)
使用ip_hdr獲取IP頭的時(shí)候,如果想要獲取tcp、或者udp的頭域,需要在當(dāng)前ip的頭指針加1,而不是加上整個(gè)IP頭大小。
正確操作:
/* 獲取IP頭指針 */ struct iphdr *iph = ip_hdr(skb);/* 獲取udp/tcp頭指針 */ struct udphdr *udph = iph + 1;錯(cuò)誤操作:
/* 獲取IP頭指針 */ struct iphdr *iph = ip_hdr(skb);/* 獲取udp/tcp頭指針 */ struct udphdr *udph = iph + sizeof(struct iphdr);一言以蔽之,c語(yǔ)言基礎(chǔ)沒(méi)掌握好 。后人哀之而鑒之。
?
總結(jié)
以上是生活随笔為你收集整理的C代码开发遇到的问题 变量初始化和结构体指针移动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux 内核源码分析 IPv6报文接
- 下一篇: 如何正确处理家庭房产和财产?