我想,其接受所述空隙的函數內分配的值,以一個結構的成員*作爲參數,然後填充基於所述偏移計算的數據值結構的成員。使用void指針和偏移計算的分配值,以結構的構件
typedef struct
{
char C_BFR_LINK[1];
char C_TABLE_DATA[1];
double MF_COD_BALANCE;
char C_TYPE_DT[1];
}ANS;
的作用
void fillin(void *pp)
{
double* FVAR;
char* CVAR;
CVAR = pp;
memcpy(CVAR,"I",1);
CVAR = (void *)(pp + 1);
memcpy(CVAR,"S",1);
FVAR = (void *)(pp + 2);
*FVAR = 234.96;
CVAR = (void *) (pp + 10);
memcpy(CVAR,"Z",1);
return ;
}
負責在各自的偏移量1,2中的值,以填補和10
我打電話內主此函數如下
**
int main()
{
void* p ;
ANS ans;
fillin(&ans);
return 0;
}
**
我調試用gdb的功能FILLIN內爲控制涉及到主程序的雙重價值丟失,這不是正確的值被分配給各成員,但一旦。
(gdb) p pp
$1 = (void *) 0xffffdabc
(gdb) x /c 0xffffdabc
0xffffdabc: 73 'I'
(gdb) x /c 0xffffdabd
0xffffdabd: 83 'S'
(gdb) n
32 *FVAR = 234.96;
(gdb) n
33 CVAR = (void *) (pp + 10);
(gdb) **x /f 0xffffdabe**
0xffffdabe: 234.96000000000001
57 return 0;
(gdb) **p ans**
$2 = {C_BFR_LINK = "I", C_TABLE_DATA = "S",
**MF_COD_BALANCE = 1.9876540305898699e-268**, C_TYPE_DT = "\213"}
任何人都可以幫我嗎?此代碼正在使用gcc 4.4.6建立任何20120305.指針或幫助是非常讚賞。
請不要這樣做。你的代碼假定了很多事情是不正確的,你不能手動計算結構成員偏移,並且是正確的,因爲編譯器可以插入用於對齊目的的填充。如果必須使用'offsetof'。而且,你在右邊的'(void *)'上不會做任何事情。你應該得到這樣的編譯器警告,'void *'上的指針運算不是很好。 – unwind 2013-02-18 11:44:35
謝謝放鬆幫助我。 – CPPP 2013-02-18 12:25:19