C語言 資料型別轉換導致讀取引數錯誤

2021-07-12 05:46:05 字數 1130 閱讀 6433

乙個資料結構定義如下:

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...