當我在sprintf()
應用程序中使用%u
使用被撞壞,它與%d
格式說明%u與sprintf的是創造碰撞
做工精細看到代碼:
#include <stdio.h>
#include <string.h>
main()
{
unsigned char dAddr[4];
unsigned char sMask[4];
unsigned char nHop[4];
memset(dAddr,0,sizeof(dAddr));
memset(sMask,0,sizeof(sMask));
memset(nHop,0,sizeof(nHop));
unsigned int u4IpDAddr = 0x01020304;
unsigned int u4IpSNetMask = 0xffff01ff;
unsigned int u4NHopGt = 0x01020304;
char *dip = (char *)&u4IpDAddr;
char *smk = (char *)&u4IpSNetMask;
char *nhp = (char *)&u4NHopGt;
sprintf(dAddr, "%u.%u.%u.%u", dip[3], dip[2], dip[1], dip[0]); //if I used %d.%d.%d.%d its working fine
sprintf(sMask, "%u.%u.%u.%u", smk[3], smk[2], smk[1], smk[0]); //if I used %d.%d.%d.%d its working fine
sprintf(nHop, "%u.%u.%u.%u", nhp[3], nhp[2], nhp[1], nhp[0]); //if I used %d.%d.%d.%d its working fine
printf("SAM: func %s line %d IpDAddr %s Mask %s NHop %s\n",__func__,__LINE__,dAddr,sMask,nHop);
}
當我宣佈一個指針與以下方式其工作正常%u.%u.%u.%u
格式
unsigned char *dip = (unsigned char *)&u4IpDAddr;
unsigned char *smk = (unsigned char *)&u4IpSNetMask;
unsigned char *nhp = (unsigned char *)&u4NHopGt;
可以任何一個解釋我什麼當我使用char
指針?
這是瘋狂的代碼。你想要做什麼? – ooga
Sourav已經給出了唯一真正的答案。你超出了你的數組邊界(兩種方式),結果是不確定的。然而,根據你的數據和你環境中默認的'char'的符號性,當你使用普通的'char'指針時,由於重新解釋一個負數的有符號數,你可能會超越你的數組*一個'char'升級爲'int')作爲一個無符號的。這可以解釋爲什麼觀察到的(未定義的)結果不同。 –
在'smk'中使用'%u'會導致未定義的行爲。 '%u'只用於打印無符號整數(或帶有非負值的整數),但某些「smk」的值是負數字符。 –