亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JNA:結構體的字符數組成員的計算大小令人驚訝

JNA:結構體的字符數組成員的計算大小令人驚訝

阿波羅的戰車 2023-07-19 10:08:10
有人可以向我解釋為什么下面的結構大小是 16 嗎?public class StringStruct extends Structure {  public char[] data = new char[4];  public StringStruct() {}  @Override  protected List<String> getFieldOrder() {    return Collections.singletonList("data");  }}public class Main {  public static void main(String[] args) {    StringStruct ss = new StringStruct();    // Prints StringStruct: 16    // I was expecting 4...    System.out.println("StringStruct: " + ss.size());  }}我想對擁有數據的結構進行建模typedef struct {   char data[4];} StringStruct_s如果我改用字節數組,它會返回預期值。盡管如此,字符數組的大小還是讓我感到驚訝。該字段是否被解釋為擁有編碼的 String ?因此,我使用各種顯式編碼(-Djna.encoding="...")啟動了這個可執行文件,看看它是否有效果。不用找了...
查看完整描述

1 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

在 中JNA,Java char 可以映射為16-bit32-bit字符。

這意味著您擁有:32/8 * 4 = 16

https://github.com/java-native-access/jna/blob/master/www/Mappings.md

在你的機器上嘗試這樣的事情

int main() {
  printf("%ld\n",sizeof(wchar_t));
}

更新

正如@Daniel 提到的,值得注意的是,C基于映射char應該通過byte.

對于這門課

interface CLibrary extends Library {


  public CLibrary.Data.ByVal GetDataValue();

  public CLibrary.Data.ByRef GetDataAllocated();


  public class Data extends Structure {


    public static final List<String> FIELDS =  List.of("array");


    public static class ByVal extends Data implements Structure.ByValue {}


    public static class ByRef extends Data implements Structure.ByReference {}


    public byte[] array = new byte[4];


    @Override

    protected List<String> getFieldOrder() {

      return FIELDS;

    }

  }

}

您將獲得預期的大?。?


查看完整回答
反對 回復 2023-07-19
  • 1 回答
  • 0 關注
  • 197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號