C和C++數(shù)據(jù)類型未對(duì)齊

字號(hào):

自己定義了一個(gè)結(jié)構(gòu),寫了一個(gè)dll返回這個(gè)結(jié)構(gòu)的數(shù)據(jù),結(jié)果一直出現(xiàn)錯(cuò)誤,后來把VS2005的所有異常打開,報(bào)出了DATA misalignment的錯(cuò)誤,查了查對(duì)我也沒什么幫助。只是猜想內(nèi)存對(duì)齊的問題。
    但我的結(jié)構(gòu)的定義是3個(gè)指針,那就是3個(gè)機(jī)器字,這樣來看是沒問題的,不存在內(nèi)存為對(duì)齊。
    后來寫程序試驗(yàn),看著每一條語句修改的內(nèi)存數(shù)據(jù)的區(qū)域,發(fā)現(xiàn)win32中的COM中,BSTR使用了SysStringByteLen和SysStringLen來計(jì)算字符串長(zhǎng)度,而我也是通過這個(gè)來malloc數(shù)據(jù),所以可能是計(jì)算的字節(jié)數(shù)有問題。導(dǎo)致數(shù)據(jù)覆蓋,結(jié)果修改后不在報(bào)錯(cuò)。
    考試大總結(jié):
    win32提供了_tcslen來計(jì)算字符串的長(zhǎng)度,實(shí)際不管是否使用unicode,返回的都是字符串的字符長(zhǎng)度,即對(duì)于unicode,L"ab你好"返回的是4,就是4個(gè)字符。
    SysStringByteLen返回的是一個(gè)字符串的字節(jié)數(shù),參數(shù)是BSTR,(BSTR開始2個(gè)字節(jié)存儲(chǔ)著字符串長(zhǎng)度),L"ab你好" 返回的是字符串中字符占用的字節(jié)數(shù),即8個(gè)字節(jié)
    SysStringLen返回的和_tcslen一樣。