乙個資料結構定義如下:
typedef struct my_struct;
然後定義一函式介面,本意是對my_struct中的int型別和string進行讀取,這裡函式介面的作者忽視了unsigned char,視為int型別
_get_my_struct_data(
my_struct *pd
ata, char *pname, int *
cfgentry)
然後呼叫:
my_struct cfg;
_get_my_struct_data(&initcfg
, "type", &
cfg.
type
); /*initcfg是乙個全域性的變數,initcfg.type = 1,這個並不是關鍵,關鍵是第三個引數
&cfg.
type*/
printf("
cfg.
type = %d\r\n
", cfg.
type
); 發現值為0,而不是1;
為什麼?
首先說明的 是這**在大端位元組順序的cpu上執行,第三個引數
&cfg.
type的位址原來是乙個unsigned char型別,而到了函式內部變成了int型別,假設這個位址是a,那麼在函式內部,由於大端位元組順序,資料高位置,放在記憶體低處,
所以記憶體分布如下:
+++++++++++++++++++
| a | a+1 |a+2| a+3 |
+++++++++++++++++++
賦值*cfgentry
= pd
ata->type;只對a+3 寫入數值1,其他的還是0;而函式返回後列印是unsigned char型別,只是位址a的值,該數值是0;
如何避免這種不細心的函式引數型別強制變化導致的錯誤,第一,在函式介面定義和使用的時候要嚴格按照型別進行,第二,不要忽視編譯過程的警告
warning: passing argument 3 of '
_get_my_struct_data
' from incompatible pointer type
或者在編譯中使用
werror引數將編譯警告視作錯誤
C語言資料型別轉換
自動轉換發生在不同資料型別的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。所有的浮點運算都是以雙精度進行的,即使僅...
C語言資料型別轉換
變數的資料型別是可以轉換的。轉換的方法有兩種,一種是自動轉換,一種是強制轉換。自動轉換發生在不同資料型別的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先...
C語言資料型別轉換
資料型別轉換就是將資料 變數 表示式的結果 從一種型別轉換到另一種型別。例如,為了儲存小數你可以將int型別的變數轉換為double型別。資料型別轉換的一般格式為 type name expressiontype name為要轉換到的資料型別,expression為表示式。例如 float a 把a...