簡體   English   中英

了解C中的結構類型的指針轉​​換

[英]Understanding pointer casting on struct type in C

我正在嘗試了解這種情況下的指針轉換。

# https://github.com/udp/json-parser/blob/master/json.c#L408

#define json_char char
typedef struct _json_object_entry
{
   json_char * name;
   unsigned int name_length;

   struct _json_value * value;

} json_object_entry;
typedef struct _json_value
{
struct
  {
     unsigned int length;

     json_object_entry * values;

     #if defined(__cplusplus) && __cplusplus >= 201103L
     decltype(values) begin () const
     {  return values;
     }
     decltype(values) end () const
     {  return values + length;
     }
     #endif

  } object;
}
(*(json_char **) &top->u.object.values) += string_length + 1;

由於我看到top->u.object.values具有值的第一個元素的地址(類型:json_object_entry),然后我們獲得值的地址,並將其轉換為char,..從這里開始丟失。 我真的不明白這個目的。

//注意:對於那些想知道這是什么的人,這是兩遍解析器。

謝謝

_json_value::values是指向json_object_entry數組開頭(或指向數組json_object_entry )的json_object_entry 該代碼將其值調整了幾個字節,例如,以便在實際數據之前跳過標頭等。 因為鍵入了指針,所以無需強制轉換就只能以sizeof(_json_object_entry)數量更改其值,但是顯然偏移量可以具有任何值,具體取決於某些string_length 因此,將指針的地址轉換為char指針的地址(char指針可以1的增量進行更改),並取消引用,因此結果是指向char的指針與實際u.object.values位於同一位置u.object.values ,然后分配給。

應該補充的是,如果體系結構要求結構的最小對齊(可能取決於它們的第一個元素,這里是一個指針),並且字符串長度的值不能是該對齊的倍數,則此類代碼可能在運行時中斷。 這將使代碼UB。 如果保留對齊方式,我不確定代碼是否名義上屬於UB。

在這里作者(有罪...)

在第一遍中,尚未分配values ,因此解析器使用相同的字段作弊,以存儲在第二遍中實際分配的內存量(長度)。

if (state.first_pass)
    (*(json_char **) &top->u.object.values) += string_length + 1;

json_charjson_char ,以便我們將char倍數增加到長度,而不是json_object_entry

這有點(...還可以,還有更多...),是像這樣骯臟的hack重用了該字段,但是這樣做是為了節省將另一個字段添加到json_value或使用聯合(C89聯合不能是匿名的,因此會使json_value的結構有些怪異)。

這里沒有UB,因為此時我們實際上並沒有使用values作為結構數組,只是顛覆了類型系統並將其用作整數。

    json_object_entry * values;
...
}

(*(json_char **) &top->u.object.values) += string_length + 1;

忘記類型正確性,可以折疊&和*:

((json_char **) top->u.object.values) += string_length + 1;

top-> u.object.values實際上是指向values數組第一個元素的指針。 它被類型轉換為一個指向json_char的指針,然后是高級string_length +1個字符。 最終結果是,top-> u.object.values現在指向(string_length +1)json_chars之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM